Qt5 Graphics View Framework

Graphics View 是一个基于元素(item)的 MV 架构的框架。它可以分成三个部分:元素 item、场景 scene 和视图 view。

基于元素的意思是,它的每一个组件都是一个独立的元素。这是与我们之前讲到过的QPainter状态机机制不同。回忆一下,使用QPainter绘图,大多是采用一种面向过程的描述方式:首先使用drawLine()画一条直线,然后使用drawPolygon()画一个多边形。对于 Graphics View,相同的过程可以是,首先创建一个场景(scene),然后创建一个直线对象和一个多边形对象,再使用场景的add()函数,将直线和多边形添加到场景中,最后通过视图进行观察,就可以看到了。乍看起来,后者似乎更加复杂,但是,如果你的图像中包含了成千上万的直线、多边形之类,管理这些对象要比管理QPainter的绘制语句容易得多。并且,这些图形对象也更加符合面向对象的设计要求:一个很复杂的图形可以很方便的复用。

MV 架构的意思是,Graphics View 提供一个 model 和一个 view(正如 MVC 架构,只不过 MV 架构少了 C 这么一个组件)。所谓模型(model)就是我们添加的种种对象;所谓视图(view)就是我们观察这些对象的视口。同一个模型可以由很多视图从不同的角度进行观察,这是很常见的需求。使用 QPainter 很难实现这一点,这需要很复杂的计算,而 Graphics View 可以很容易的实现。

Graphics View 提供了QGraphicsScene作为场景,即是允许我们添加图形的空间,相当于整个世界;QGraphicsView作为视口,也就是我们的观察窗口,相当于照相机的取景框,这个取景框可以覆盖整个场景,也可以是场景的一部分;QGraphicsItem作为图形元件,以便添加到场景中去,Qt 内置了很多图形,比如直线、多边形等,它们都是继承自QGraphicsItem

#include <QApplication>
#include "mainwindow.h"
#include<QGraphicsScene>
#include<QGraphicsView>

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();
}

程序运行结果:

我们看到,这个直线自动在视图居中显示。这并不需要我们进行任何额外的代码。如果不想这么做,我们可以给 scene 设置一下sceneRect()属性:

#include <QApplication>
#include "mainwindow.h"
#include<QGraphicsScene>
#include<QGraphicsView>

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.show();
        return app.exec();
}

程序运行结果

 

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/86527846