Qt学习之路(30):Graphics View Framework

现在基本上也已经到了2D绘图部分的尾声,所谓重头戏都是在最后压轴的,现在我们就要来看看在绘图部分功能最强大的Graphics View。我们经常说KDE桌面,新版本的KDE桌面就是建立在Graphics View的基础之上,可见其强大之处。

Qt的白皮书里面这样写道:“Qt Graphics View 提供了用于管理和交互大量定制的 2D 图形对象的平面以及可视化显示对象的视图 widget,并支持缩放和旋转功能。Graphics View 使用 BSP(二进制空间划分)树形可非常快速地找到对象,因此即使是包含百万个对象的大型场景,也能实时图形化显示。”

Graphics View是一个基于item的M-V架构的框架。

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

M-V架构的意思是,Graphics View提供一个model和一个view。所谓model就是我们添加的种种对象,所谓view就是我们观察这些对象的视口。同一个model可以由很多view从不同的角度进行观察,这是很常见的需求。使用QPainter就很难实现这一点,这需要很复杂的计算,而Qt的Graphics View就可以很容易的实现。

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

下面我们来看一下代码:

#include <QtGui>
class DrawApp : public QWidget {
public:
   DrawApp();
protected:
        void paintEvent(QPaintEvent *event);
};
DrawApp::DrawApp()
{
}
void DrawApp::paintEvent(QPaintEvent *event)
{
 QPainter painter(this);
 painter.drawLine(10, 10, 150, 300);
}
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 QGraphicsScene *scene = new QGraphicsScene;
 scene->addLine(10, 10, 150, 300);
 QGraphicsView *view = new QGraphicsView(scene);
 view->resize(500, 500);
 view->setWindowTitle("Graphics View");
 view->show();
 DrawApp *da = new DrawApp;
 da->resize(500, 500);
 da->setWindowTitle("QWidget");
 da->show();
 return a.exec();
}

时间: 2024-12-11 01:17:03

Qt学习之路(30):Graphics View Framework的相关文章

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

Qt学习之路(32):一个简易画板的实现(Graphics View)

本文配套源码 这一次将介绍如何使用Graphics View来实现前面所说的画板.前面说了很多有关Graphics View的好话,但是没有具体的实例很难说究竟好在哪里.现在我们就把前面的内容使用Graphics View重新实现一下,大家可以对比一下看有什么区别. 同前面相似的内容就不再叙述了,我们从上次代码的基础上进行修改,以便符合我们的需要.首先来看MainWindow的代码: mainwindow.cpp #include "mainwindow.h" MainWindow::

Qt学习之路(31):一个简易画板的实现(QWidget)

说实话,本来我是没有打算放一个很大的例子的,一则比较复杂,二来或许需要很多次才能说得完.不过,现在已经说完了绘图部分,所以计划还是上一个这样的例子.这里我会只做出一个简单的画板程序,大体上就是能够画直线和矩形吧.这样,我计划分成两种实现,一是使用普通的QWidget作为画板,第二则是使用Graphcis View Framework来实现.因为前面有朋友说不大明白Graphics View的相关内容,所以计划如此. 好了,现在先来看看我们的主体框架.我们的框架还是使用Qt Creator创建一个

Qt学习之路(23):自定义事件

Qt允许你创建自己的事件类型,这在多线程的程序中尤其有用,当然,也可以用在单线程的程序中,作为一种对象间通讯的机制.那么,为什么我需要使用事件,而不是使用信号槽呢?主要原因是,事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的.事件的另外一个好处是,它可以使用过滤器. Qt中的自定义事件很简单,同其他类似的库的使用很相似,都是要继承一个类进行扩展.在Qt中,你需要继承的类是QEvent.注意,在Qt3中,你需要继承的类是QCustomEvent,不过这个类在Qt4中

C# 有没有类似QT 中的Graphics View Framework 的东西

问题描述 C#有没有类似QT中的GraphicsViewFramework的东西,GraphicsViewFramework真的好用 解决方案 解决方案二: 解决方案三:伟大的金同志,嚒意思啊

Qt学习之路(24):QPainter

多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子.因为event比较难做例子,也就没有去写,只是把大概写了一下.今天带来的是新的部分,有关Qt的2D绘图.这部分不像前面的内容,还是比较好理解的啦!所以,例子也会增加出来. 有人问豆子拿Qt做什么,其实,豆子就是在做一个Qt的画图程序,努力朝着Photoshop和GIMP的方向发展.但这终究要经过很长的时间.很困难的路程的,所以也放在网上开源,有兴趣的朋友可以来试试的呀- 好了,闲话少说,来继续我们的学习吧! Qt的绘图系

Qt学习之路(12):菜单和工具条

在前面的QMainWindow的基础之上,我们开始着手建造我们的应用程序.虽然现在已经有一个框架,但是,确切地说我们还一行代码没有写呢!下面的工作就不那么简单了!在这一节里面,我们要为我们的框架添加菜单和工具条. 就像Swing里面的Action一样,Qt里面也有一个类似的类,叫做QAction.顾名思义,QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述.图标.快捷键.回调函数(也就是信号槽),等等.神奇的是,QAction能够根据添加的位置来改变自己的样子 --如

Qt学习之路(11):MainWindow

尽管Qt提供了很方便的快速开发工具QtDesigner用来拖放界面元素,但是现在我并不打算去介绍这个工具,原因之一在于我们的学习大体上是依靠手工编写代码,过早的接触设计工具并不能让我们对Qt的概念突飞猛进-- 前面说过,本教程很大程度上依照的是<C++ GUI Programming with Qt4, 2nd Edition>这本书.但是,这本书中接下来的部分用了很大的篇幅完成了一个简单的类似Excel的程序.虽然最终效果看起来很不错,但我并不打算完全依照这个程序来,因为这个程序太大,以至于

Qt学习之路(2):Hello,world!

任何编程技术的学习第一课基本上都会是Hello, world!,我也不想故意打破这个惯例--照理说,应该首先回顾一下Qt的历史,不过即使不说这些也并无大碍. 或许有人总想知道,Qt这个单词是什么意思.其实,这并不是一个缩写词,仅仅是因为它的发明者,TrollTech公司的 CEO,Haarard Nord和Trolltech公司的总裁Eirik Chambe-Eng在联合发明Qt的时候并没有一个很好的名字.在这里,字母Q是Qt库中所有类的前缀--这仅仅是因为在Haarard的emacs的字体中,