一、图形视图框架结构
图形视图框架由场景QGraphicsScene、视图QGraphicsView、图形项QGraphicsItem组成,它提供了一套基于图形项模型视图编程方法。图形视图框架可以管理数量庞大的自定义2D图形项,比如要绘制上万个图形并对这些图形进行拖动、检测位置等操作的话使用图形视图框架就可以方便的管理它们。场景中可以包含各种形状的图形项,使用视图来使图形项可视化,多个视图可以在一个场景中查看。视图还支持缩放和旋转,使用视图的变换矩阵函数QGraphicsView::transfrom()可以变换场景的坐标系统,这样便可以实现缩放、旋转等功能。
场景是图形项的容器,场景提供了管理大量图形项的快速接口,并传播事件给图形项和管理图形项的状态(选择、焦点处理等)。为场景设置视图后才可以看到图形项,视图部件是一个可滚动的区域,默认QGraphicsView提供了一个QWidget作为视口部件,如果要使用OpenGL进行渲染可以调用setViewport()设置QGLWidget作为视口。场景可以分为图形项层、前景层、背景层,场景的 绘制总是从背景开始、最后是前景,前景和背景还可以使用渐变和贴图等来实现特殊效果,比如半透明的黑色可以实现夜幕降临的效果。场景中也有跟视图同名的设置前景、背景的方法,不过它对所有关联的视图都有效。
#include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> #include <QGraphicsRectItem> #include <QDebug> int main(int argc, char**argv) { QApplication app(argc, argv); QGraphicsScene scene; //创建场景 QGraphicsRectItem* item = new QGraphicsRectItem(0, 0, 100, 100); //创建矩形图形项 scene.addItem(item); //添加矩形图形项到场景 QList<QGraphicsItem *> l = scene.items(); //获得场景中所有的图形项(递减顺序,最上面的图形项在前面) l = scene.items(Qt::AscendingOrder); //获得场景中所有的图形项,增序 QGraphicsItem* pItem = scene.itemAt(50, 50); //获得(50, 50)点处的图形项 qDebug() << pItem; QPainterPath path; path.addRect(0, 0, 200, 200); scene.setSelectionArea(path); //选择区域中所有的图形项 scene.setFocusItem(pItem); //设置图形项焦点 //scene.removeItem(pItem); //删除图形项 QGraphicsView view(&scene); //为场景创建视图 view.setDragMode(QGraphicsView::ScrollHandDrag); //设置光标变为手掌形状从而可以拖动场景 view.setDragMode(QGraphicsView::RubberBandDrag); //设置可以使用鼠标拖出橡皮筋来选择图形项 view.setForegroundBrush(QColor(255, 255, 255, 100)); //设置场景的前景色 view.setBackgroundBrush(QPixmap("./background.png")); //设置场景的背景图片 view.resize(500, 400); //设置视图大小 view.show(); //显示视图 return app.exec(); }