Graphics View Framework
Qt 学习之路 2(30):Graphics View Framework
GraphicsView和QPainter的区别
QPainter:面向过程。
使用QPainter绘图,大多是采用一种面向过程的描述方式:首先使用drawLine()画一条直线,然后使用drawPolygon()画一个多边形。
GraphicsView:面向对象。
对于 Graphics View,相同的过程可以是,首先创建一个场景(scene),然后创建一个直线对象和一个多边形对象,再使用场景的add()函数,将直线和多边形添加到场景中,最后通过视图进行观察,就可以看到了。
GraphicsView使用
Graphics View 提供了QGraphicsScene作为场景,即是允许我们添加图形的空间,相当于整个世界;QGraphicsView作为视口,也就是我们的观察窗口,相当于照相机的取景框,这个取景框可以覆盖整个场景,也可以是场景的一部分;QGraphicsItem作为图形元件,以便添加到场景中去,Qt 内置了很多图形,比如直线、多边形等,它们都是继承自QGraphicsItem。
int main(int argc, char *argv[]) { QApplication app(argc, argv); QGraphicsScene scene; scene.addLine(0, 0, 150, 150); QGraphicsView view(&scene); view.setWindowTitle("Graphics View"); view.resize(500, 500); view.show(); return app.exec(); }
段代码很简单:
首先创建一个场景,也就是QGraphicsScene对象。然后我们使用addLine()函数向场景中添加了一个直线,起始点和终点坐标分别是 (0, 0) 和 (150, 150)。可以想象,这是一个边长 150px 的正方形的对角线。通过这两步,我们已经有了场景和元素。之后,我们创建一个GraphicsView对象,绑定到一个场景上(也就是我们前面创建的 scene 对象)。注意,QGraphicsScene不是QWidget的子类,因此该构造函数并不是调用的QGraphicsView(QWidget *parent)。
接下来,我们可以运行一下代码:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QGraphicsScene scene; scene.setSceneRect(0, 0, 300, 300); scene.addLine(0, 0, 150, 150); QGraphicsView view(&scene); view.setWindowTitle("Graphics View"); // view.resize(500, 500); view.show(); return app.exec(); }
sceneRect属性供QGraphicsView确定视图默认的滚动条区域.
去掉view.resize()一行,是因为我们让系统去决定视图的最小尺寸(否则的话,我们需要手动将窗口标题栏等的大小同时考虑设置)。