Arthur绘图系统

Arthur绘图系统=QPainter+QPaintDevice+QPainterEngine

QPainter:用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等;

QPaintDevice是QPainter用来绘图的绘图设备,QT中有几种预定义的绘图设备,如QWidget,QPixmap,QPrinter等。它们都从QPaintDevice继承。

QPaintEngine类提供了不同类型设备的接口,QPaintEngine对程序员不透明,由QPainter,QPaintDevice类与其进行交互。

从QT4.2 开始,Graphics View框架使用了MVC模式,适合大量的2D图元的管理,在Graphics View框架中,场景存储了图像数据,它通过视图以多种形式表现,每个图元可以单独进行控制。


字体的属性可以使用QFontInfo类获取,字体的度量使用QFontMetrics类来获取,QFontDatabase类可以得到底层窗口系统的所有可用字体的信息。

通常情况下,QPainter以默认的坐标系统进行绘制,也可以使用QMatrix类对坐标进行变换;当绘制时,可以使用QPainter::RenderHint来告诉绘图引擎是否启用反锯齿功能使绘图更为平滑。


drawPicture()函数负责绘制QPicture中存储的QPainter指令,QPicture是可以记录QPainter绘图指令的类,它将QPainter的绘图指令串行化为平台无关的格式存储。使用如下:

QPicture picture;

picture.load("mypicture.pic");

QPainter painter(this);

painter.drawPicture(0,0,picture);

上面的代码片段装入绘图文件mypicture.pic,并在点(0,0)处重放绘图指令。也可以用QPicture::Play()函数来完成相同的功能。



QPen:

如果要使用自定义的线风格(Qt::CustomDashLine),则需要使用QPen的setDashPattern()函数来设置自定义风格。如:

QPen pen;

QVector customDashs;

qreal blank=4;

dashes<<2<

pen.setDashPattern(customDashes);

QVector中奇数位置的数是实线的长度,偶数位置的数是空白的长度。


端点风格( cap style ):

Qt::SquareCap:方形并将端点延长至线宽的一半。

Qt::FlatCap:方形端点但没有将线延长。

Qt::RoundCap:圆形的端点。


连接风格(join style)



填充模式:

Qt::BrushStyle枚举变量包括基本模式填充、渐变填充、纹理填充。

1、渐变填充包括两个要素:颜色的变化和路径的变化。颜色变化可以指定从一种颜色渐变到另外一种颜色,也可以在变化的路径上指定一些点的颜色进行分段渐变。QT中有3种渐变填充:线性,圆形,锥形,所有类均从QGradient类继承。

线性填充例子:指定两个控制点,画刷在两个控制点之间进行颜色插值。

QLinearGradient linearGradient(0,0,200,100);

linearGradient.setColorAt(0,Qt::red);

linearGradient.setColorAt(0.5,Qt::green);

linearGradient.setColorAt(1, Qt::blue);

painter.setBrush( linearGradient );

painter.drawRect(0,0,200,100);

2、圆形渐变填充需要指定圆心,半径,焦点,画刷在焦点和圆上的所有点之间进行颜色插值。

QRadialGradient radialGradient(50,50,50,30,30);

radialGradient.setColorAt(0.2, Qt::cyan);

radialGradient.setColorAt(0.8, Qt::yellow);

radialGradient.setColorAt(1,Qt::magenta);

painter.setBrush(radialGradient);

painter.drawEllipse(0,0,100,100);

3、圆锥填充:指定圆心和开始角,画刷沿圆心逆时针对颜色进行插值。

QConicalGradient conicalGradient(60,40,30);

conicalGradient.setColorAt(0,Qt::gray);

conicalGradient.setColorAt(0.4, Qt::darkGreen);

conicalGradient.setColorAt(0.6, Qt::darkMagenta);

conicalGradient.setColorAt(1,Qt::darkBlue);

painter.setBrush(conicalGradient);

painter.drawEllipse(0,0,100,100);


关闭窗口部件的双缓冲:

myWidget->setAttribute(Qt::WA_PaintOnScreen);


在交互绘制过程中,程序将图像缓冲区复制到临时缓冲区,并在临时缓冲区上绘制,绘制完毕再将结果复制图像缓冲区。如果没有交互绘制,则直接将图像缓冲区显示到屏幕上。


QWidget类有一个属性windowOpacity,通过setWindowOpacity(qreal level)可以设置窗口的透明度。该属性和Aplha通道实现原理并不相同。


要实现自己的绘图设备,必须从QPaintDevice类继承并实现虚函数QPaintDevice::paintEngine()以告知QPainter能够在这个特定的设备上绘制图像。同时还需要从QPaintEngine类继承自定义的图像绘制引擎。


使用QImage的优点是可以获得与平台无关的绘制操作,另外一个好处是图像可以不必在GUI线程中处理。

QPixmap是后台显示的图像,它为在屏幕上显示图像提供优化。不同于QImage,pixmap的图像数据是用户不可见,而且由底层窗口系统管理。为了优化QPixmap绘图,QT提供了QPixmapCache类来存储临时的pixmap。

QT还提供了从QPixmap继承的QBitmap类,QBitmap表示单色的pixmap,主要用来创建自定义的QCursor和QBrush对象,构造QRegion对象,设置pixmap和窗口部件的掩码。


与QMatrix不同的是,QTransform支持透视变换,使用toAffine()函数可以将QTransform对象转换为QMatrix对象,但是这将丢失QTransform的透视变换数据。


绘图路径可以进行填充、显示轮廓和剪裁。要生成可填充的轮廓的绘图路径,可以使用QPainterPathStroker类。使用QPainterPath的优点是复杂图形只需创建一次,就可以多次使用。


QT提供4个处理图像的类:QImage,QPixmap,QBitmap,QPicture。

QImage:优化了I/O操作,可直接存取操作像素数据;提供与硬件无关的图像表示方法,支持的图像颜色有单色,8位,32位和Alpha混合格式。

QPixmap:主要用来在屏幕上显示图像;主要完成屏幕后台缓冲区绘图。QPixmap对象可以使用QLabel或QAbstractButton子类(QPushButton,QToolButton)显示,QLabel通过设置pixmap属性,QAbstractButton通过设置icon属性来完成。QPixmap对象还可以使用静态函数grabWidget()和grabWindow()函数创建,并绘制指定的窗口和窗口部件。

QPixmap中的像素数据是内部的,并且由底层的窗口系统进行管理,如果要存储像素,只有通过QPainter函数或将QPixmap对象转换在QImage对象,根据底层系统的不同,QPixmap可以RGB32或混合alpha格式存储。因此QPixmap是依赖底层系统的。

QBitmap:从QPixmap继承,只能表示两种颜色;

QPicture:可以记录和重放QPainter命令的类。


组合模式:用来指定如何合并源图像和一个图像。


Graphics View框架中包括三个主要的类:QGraphicScene,QGraphicsView和QGraphItem,分别是场景、视图和图元。

QGraphicsScene类实现Graphics View中的场景,场景类主要完成如下功能:

1、提供管理大量图元的快速接口;

2、传播事件给场景中的每个图元;

3、管理图元状态,如选择和焦点处理;

4、提供无变换的绘制功能,如打印。

场景是QGraphicsItem对象的容器,通过函数QGraphicsScene::addItem可以加入一个图元到场景中。图元可以过通多个函数进行检索。

QGraphicsItem具有下列功能:

1、处理鼠标按下,移动,释放,双击,悬停,滚轮和右键菜单事件;

2、处理键盘输入事件;

3、处理拖放事件;

4、分组;

5、碰撞检测;

6、图元可以包含子图元;


所有的鼠标事件最开始都是使用视图坐标。

QGraphicsItem支持图元特定的光标和工具提示。在鼠标进入图元区域时激活相应的光标和工具提示。






你可能感兴趣的:(QT)