Qt2D基本绘图之QPainter应用

admin2024-04-03  0

==一、引言==
Qt作为一个强大的基于C++的跨平台软件开放平台,本身提供了很多基本的控件和容器等供用户使用,例如常见的button\label\widget等,这些能够满足开发人员的基本需求,但是对于一些特殊的样式要求就需要开发人员使用Qt的绘图系统进行自定义绘制。Qt提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上绘制,主要基于QPainter/QPaintDevice和QPaintENgine三个类,本文主要对最为常用的QPainter类进行介绍和探讨。

==二、QPainter==
QPainter是系统提供的完成具体绘制操作的类,一般会在paintEvent()函数中实现对具体部件的绘制,在使用repaint()和update()函数后会调用paintEvent()函数。该类中提供了大量高度优化的函数完成GUI编程所需要的大部分绘制工作,从点到线,到任意形状和复杂的图形都可以绘制。除此之外,QPainter也提供了反锯齿、像素混合、渐变填充和矢量路径等功能,还支持图形的线性变换,例如平移、旋转和缩放等。在这里介绍项目开发中最常用到的几种绘制内容以及绘制方法。
===1、绘制2D图形===
首先创建QPainter对象,如上文提到的Qt提供了一些函数使得绘制的图像更加平滑,设置QPainter::Antialiasing尽可能的进行边的反锯齿绘制,使得绘制的图形更加平滑。
```
lang = c++
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
```
在定义了QPainter类对象之后,选择绘图工具QPen和QBrush,前者为画笔后者为画刷,QPen主要用来绘制图形的轮廓线,而QBrush则用来填充图形。QPen的常用函数如下表:
|函数原型|功能|
|void setColor(QColor &color)|设置画笔颜色|
|void setWidth(int width)|设置线条宽度|
|void setStyle(Qt::PenStyle style)|设置线条样式|
|void setCapStyle(Qt::PenCapStyle style)|设置线条端点样式|
|void setJoinStyle(Qt::PenJoinStyle style)|设置连接样式|
其中线条颜色与线条宽度比较容易理解,支持QColor包含的颜色和用户自定义设置的线条宽度,而线条样式、线条端点样式和连接样式则是使用Qt提供的枚举类型。如果Qt提供的基本的线条样式无法满足开发者需求,则可以使用setDashOffset()和setDashPattern()函数自定义线条样式,这里不做展开,需要的用户可以继续深入了解。其中Qt提供的先调样式如下
Qt提供的笔帽风格有:Qt::SquareCap 方形线端,不覆盖线的端点;Qt::FlatCap 方形线端,覆盖线的端点,并以线框一半向外延伸;Qt::RoundCap 圆线端

Qt提供的线条连接样式有:Qt::BevelJoin 两条线相汇形成方形连接、Qt::MiterJoin 两条线相汇形成尖角连接、Qt::RoundJoin两条线相汇形成圆角连接

QBrush的常用函数则如下表:
|void setColor(QColor &color)|设置画刷颜色,填充颜色|
|void setStyle(Qt::BrushStyle style)|设置画刷样式|
|void setTexture(QPixmap &pixmap)|设置一个QPixmap类型的图片作为画刷的图片|
|void setTextureImage(QImage &iamge)|设置一个QImage类型的图片作为画刷的图片|
其中Qt提供的典型的额画刷样式如下
在完成对画笔和画刷的设置后就可以开始绘制图形了,Qt提供了基本图形元件的绘制函数:
|drawArc|画弧线|
|drawChord|画一段弦|
|drawConverPolygon|画给定点的凸多边形|
|drawEllipse|画椭圆|
|drawLine|画线|
|drawLines|画多条线|
|drawPath|绘制由QPainterPath对象定义的路线|
|drawPie|画扇型|
|drawPoint|画一个点|
|drawPoints|画多个点|
|drawPolygon|画多边形|
|drawPolyLine|画多点连接的线|
|drawRect|画矩形|
|drawRoundedRect|画圆角矩形|
|eraseRect|擦除某个矩形区域|
|fillPath|填充绘图路径|
|fillRect|填充矩形区域|
利用这些基本的绘图原件可以实现各种复杂的图形要求
===2、绘制文本===
QPainter还可以实现对文本的绘制,通过QFont类可以设置文本的字体、大小、样式等,通过setFont添加到QPainter中。
调用drawText(QRect, Qt::AlignCenter)设置文字显示位置和显示样式并绘制文本
```
lang = c++
    // 设置字体:微软雅黑、点大小50、斜体
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPointSize(50);
    font.setItalic(true);
    painter.setFont(font);

    // 绘制文本
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
```
===3、绘制图片===
QPainter的图片绘制可以理解为将图片显示到设定的区域内,调用drawPixmap(QRect, QPixmap)函数将图片显示到指定的矩形区域内。
```
lang = c++
QString kSwitchButtonOnBackgroundURL = ":/SurveillanceSystem/Resources/Common/common/switch_on_shape.png";
pImageOn = new QPixmap(kSwitchButtonOnBackgroundURL );
painter->drawPixmap(this->rect(), *pImageOn, QRect());
```
===4、QPainter的状态保存与恢复===
在绘图过程中我们往往需要将不同的画笔、画刷等信息设置到QPianter中,如果每次都重新设置则比较麻烦,因此QPainter提供了状态保存与恢复函数save/restore.save函数保存QPainter的状态,restore用于恢复QPainter的状态,两者往往一起使用,而且save和restore采用堆栈的形式嵌套的保存和恢复,先进后出原则。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!