Qt学习之路(24): QPainter

简介:
多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子。因为event比较难做例子,也就没有去写,只是把大概写了一下。今天带来的是新的部分,有关Qt的2D绘图。这部分不像前面的内容,还是比较好理解的啦!所以,例子也会增加出来。
 
有人问豆子拿Qt做什么,其实,豆子就是在做一个Qt的画图程序,努力朝着Photoshop和GIMP的方向发展。但这终究要经过很长的时间、很困难的路程的,所以也放在网上开源,有兴趣的朋友可以来试试的呀…
 
好了,闲话少说,来继续我们的学习吧!
 
Qt的绘图系统允许使用相同的API在屏幕和打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
 
QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间可以由QPainter在上面进行绘制;QPaintEngine提供了画笔painter在不同的设备上进行绘制的统一的接口。QPaintEngine类用在QPainter和QPaintDevice之间,并且通常对开发人员是透明的,除非你需要自定义一个设备,这时候你就必须重新定义QPaintEngine了。
 
下图给出了这三个类之间的层次结构(出自Qt API 文档):
 
QPainter
 
这种实现的主要好处是,所有的绘制都遵循着同一种绘制流程,这样,添加可以很方便的添加新的特性,也可以为不支持的功能添加一个默认的实现方式。另外需要说明一点,Qt提供了一个独立的QtOpenGL模块,可以让你在Qt的应用程序中使用OpenGL功能。该模块提供了一个OpenGL的模块,可以像其他的Qt组件一样的使用。它的不同之处在于,它是使用OpenGL作为显示技术,使用OpenGL函数进行绘制。对于这个组件,我们以后会再介绍。
 
通过前面的介绍我们知道,Qt的绘图系统实际上是说,使用QPainter在QPainterDevice上面进行绘制,它们之间使用QPaintEngine进行通讯。好了,下面我们来看看怎么使用QPainter。
 
首先我们定义一个组件,同前面的定义类似:
 
InBlock.gif class PaintedWidget :  public QWidget 
InBlock.gif
InBlock.gif public
InBlock.gif        PaintedWidget(); 
InBlock.gif 
InBlock.gif protected
InBlock.gif         void paintEvent(QPaintEvent * event); 
InBlock.gif};
 
这里我们只定义了一个构造函数,并且重定义paintEvent()函数。从名字就可以看出,这实际上是一个事件的回调函数。请注意,一般而言,Qt的事件函数都是protected的,所以,如果你要重写事件,就需要继承这个类了。至于事件相关的东西,我们在前面的内容已经比较详细的叙述了,这里不再赘述。
 
构造函数里面主要是一些大小之类的定义,这里不再详细说明:
 
InBlock.gifPaintedWidget::PaintedWidget() 
InBlock.gif
InBlock.gif        resize(800, 600); 
InBlock.gif        setWindowTitle(tr( "Paint Demo")); 
InBlock.gif}
 
我们关心的是paintEvent()函数的实现:
 
InBlock.gif void PaintedWidget::paintEvent(QPaintEvent * event
InBlock.gif
InBlock.gif        QPainter painter( this); 
InBlock.gif        painter.drawLine(80, 100, 650, 500); 
InBlock.gif        painter.setPen(Qt::red); 
InBlock.gif        painter.drawRect(10, 10, 100, 400); 
InBlock.gif        painter.setPen(QPen(Qt::green, 5)); 
InBlock.gif        painter.setBrush(Qt::blue); 
InBlock.gif        painter.drawEllipse(50, 150, 400, 200); 
InBlock.gif}
 
为了把我们的程序运行起来,下面是main()函数:
 
InBlock.gif int main( int argc,  char *argv[]) 
InBlock.gif
InBlock.gif        QApplication app(argc, argv); 
InBlock.gif        PaintedWidget w; 
InBlock.gif        w.show(); 
InBlock.gif         return app.exec(); 
InBlock.gif}
 
 
运行结果如下所示:
 
 
首先,我们声明了一个QPainter对象。注意,我们在这个函数的栈空间建立了对象,因此不需要delete。
 
QPainter接收一个QPaintDevice*类型的参数。QPaintDevice有很多子类,比如QImage,以及QWidget。注意回忆一下,QPaintDevice可以理解成要在哪里去画,而现在我们希望在这个widget上画,因此传入的是this指针。
 
QPainter有很多以draw开头的函数,用于各种图形的绘制,比如这里的drawLine,drawRect和和drawEllipse等。具体的参数请参阅API文档。下图给出了QPainter的draw函数的实例,本图来自C++ GUI Programming with Qt4, 2nd Edition.
 
 
好了,今天先到这里,我们将在下面一章中继续对这个paintEvent()函数进行说明。

本文转自 FinderCheng 51CTO博客,原文链接:
http://blog.51cto.com/devbean/235332
相关文章
|
7月前
|
Linux C语言
[学习][笔记] qt5 从入门到入坟:<一>hello Qt
[学习][笔记] qt5 从入门到入坟:<一>hello Qt
|
6月前
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
65 0
|
7月前
|
C++
[学习][笔记] qt5 从入门到入坟:《零》vs开发qt项目
[学习][笔记] qt5 从入门到入坟:《零》vs开发qt项目
|
7月前
QT(QPainter画圆弧)
QT(QPainter画圆弧)
73 0
|
7月前
|
定位技术 图形学
[学习][笔记] qt5 从入门到入坟:<13>基于GraphicsViewFrame的贪吃蛇实现
[学习][笔记] qt5 从入门到入坟:<13>基于GraphicsViewFrame的贪吃蛇实现
|
7月前
|
图形学
[学习][笔记] qt5 从入门到入坟:<12>Graphics View Framework
[学习][笔记] qt5 从入门到入坟:<12>Graphics View Framework
|
7月前
|
编解码 图形学
[学习][笔记] qt5 从入门到入坟:<11>绘制设备
[学习][笔记] qt5 从入门到入坟:<11>绘制设备
|
7月前
[学习][笔记] qt5 从入门到入坟:<10>坐标系统
[学习][笔记] qt5 从入门到入坟:<10>坐标系统
|
7月前
|
图形学
[学习][笔记] qt5 从入门到入坟:<九>反走样,渐变
[学习][笔记] qt5 从入门到入坟:<九>反走样,渐变
|
7月前
|
API
[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统
[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统