画图可以在QWidget上重写paintEvent实现,但是设计形如PLC梯形图包含大量独立元件的场景时,使用paintEvent会变得复杂,不能直接操作元件给元件改变属性,需要繁琐处理鼠标事件来确定是对哪一个元件操作,缩放也要单独处理,因为梯形图比较长,还需要有QScrollArea的派生类作为QWidget的派生类的父层,当梯形图过大时,还需要对QScrollArea及QWidget做单独处理,使得滚动时只显示部分内容,否则会刷新过慢,这又给鼠标事件增加了复杂性。
结合使用QGraphicsView(视图) QGraphicsScene(场景) QGraphicsItem(项目)时:
1.不需要单独的QScrollArea派生类,QGraphics本身继承自QAbstractScrollArea
2.元件可以直接派生自QGraphicsItem(或QGraphicsObject),QGraphicsItem和QGraphicsObject都有鼠标事件,而QGraphicsObject还具有信号和槽以及源对象属性,不必使用传QWiget画图指针给元件对象画图这么繁琐。
3.不需要单独处理缩放功能,自带
4.非常大的场景显示时不存在刷新慢,卡顿的问题
5.QGraphicsItem可以通过设置z值来确定不用元件上下层的关系,实现图层效果
6.QGraphicsItem有父子关系,再结合z值,可以组合成复杂的元件,并可以对元件上的小item做单独的处理