[学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统

简介: [学习][笔记] qt5 从入门到入坟:<八>Qt 绘制系统

Qt 学习之路 2(24):Qt 绘制系统简介

Qt 绘制系统简介

Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制

整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。

QPainter用来执行绘制的操作;

QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;

QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。

QPainter是画笔。

QPaintDevice是画布。

QPaintEngine是笔筒,是接口 提供画笔的。

QPainter

//paintedWidget.h
#ifndef PAINTEDWIDGET_H
#define PAINTEDWIDGET_H
#include <QPainter>
#include <QWidget>
class PaintedWidget : public QWidget
{
    Q_OBJECT
public:
    PaintedWidget(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *);
};
#endif // PAINTEDWIDGET_H
//paintedWidget.cpp
#include "paintedWidget.h"
PaintedWidget::PaintedWidget(QWidget *parent) :
    QWidget(parent)
{
    resize(800, 600);//设置了窗口的大小和标题
    setWindowTitle(tr("Paint Demo"));
}
void PaintedWidget::paintEvent(QPaintEvent *) //绘制
{
    QPainter painter(this);
    painter.drawLine(80, 100, 650, 500);//
    painter.setPen(Qt::red);
    painter.drawRect(10, 10, 100, 400);
    painter.setPen(QPen(Qt::green, 5));
    painter.setBrush(Qt::blue);
    painter.drawEllipse(50, 150, 400, 200);
}
//main.cpp
#include <QApplication>
#include <paintedWidget.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    PaintedWidget w;
    w.show();
    return a.exec();
}

!!!

paintEvent()是需要重复进入的,因此,需要注意第二次进入时,QPainter的状态是不是和第一次一致,否则的话可能会造成闪烁的现象。

QPainter接收一个QPaintDevice指针作为参数。QPaintDevice有很多子类,比如QImage,以及QWidget。注意回忆一下,QPaintDevice可以理解成要在哪里去绘制,而现在我们希望画在这个组件,因此传入的是 this 指针。

!!!

绘制顺序,首先是直线,然后是矩形,最后是椭圆。按照这样的绘制顺序,可以看到直线是第一个绘制,位于最下一层;矩形是第二个绘制,在中间一层;椭圆是最后绘制,在最上层。

需要重绘情况

比如组件刚刚创建出来的时候就需要重绘;组件最大化、最小化的时候也需要重新绘制;组件由遮挡变成完全显示的时候也需要等等。

QPainterDevice

QPaintEngine

Qt 学习之路 2(25):画刷和画笔

画刷和画笔

QBrush画刷

QBrush定义了QPainter的填充模式,具有样式、颜色、渐变以及纹理等属性。

画刷的color()定义了填充模式的颜色。

画刷的gradient()定义了渐变填充。

Qt 提供了三种渐变:

QLinearGradient、QConicalGradient和QRadialGradient,它们都是QGradient的子类。

QRadialGradient gradient(50, 50, 50, 50, 50);
gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1));
gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));
QBrush brush(gradient);

QPen画笔

QPen定义了用于QPainter应该怎样画线或者轮廓线。

画笔具有 样式、宽度、画刷、笔帽样式和连接样式 等属性。

画笔样式

style()定义了线的样式。画刷brush()用于填充画笔所绘制的线条。

笔帽样式

capStyle()定义了使用QPainter绘制的线的末端;

连接样式

joinStyle()则定义了两条线如何连接起来。

画笔宽度

width()或widthF()定义了画笔的宽。

QPainter painter(this);
QPen pen;  // creates a default pen
pen.setStyle(Qt::DashDotLine);
pen.setWidth(3);
pen.setBrush(Qt::green);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::RoundJoin);

QPainter也是一个状态机,这里我们所说的这些属性都是处于这个状态机之中的,因此,我们应该记得是否要将其保存下来或者是重新构建。

本章节代码

相关文章
|
1月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
85 3
(13) Qt事件系统(two)
|
1月前
|
存储 SQL 数据库连接
【QT速成】半小时入门QT6之QT前置知识扫盲(二)
【QT速成】半小时入门QT6之QT前置知识扫盲(二)
97 13
|
1月前
|
存储 SQL 数据库连接
【QT速成】半小时入门QT6之QT前置知识扫盲(二)
【QT速成】半小时入门QT6之QT前置知识扫盲(二)
|
1月前
|
数据可视化 编译器 API
【QT速成】半小时入门QT6之QT前置知识扫盲(一)
【QT速成】半小时入门QT6之QT前置知识扫盲(一)
109 2
|
1月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
77 0
(12)Qt事件系统(one)
|
2月前
|
定位技术 Go 开发工具
dynamic-situational-awareness-qt学习记录
本文是作者yantuguiguziPGJ关于dynamic-situational-awareness-qt学习记录的分享,介绍了在Qt学习过程中发现的qml资源丰富的代码仓库,并提供了资源路径和相关的安装、配置步骤,涉及的内容有数字地球、GIS纹理等,同时提供了相关链接和git命令来克隆代码仓库和ArcGIS Runtime SDK for Qt的安装说明。
|
1月前
|
编译器 API C语言
【QT速成】半小时入门QT6之QT前置知识扫盲(一)
【QT速成】半小时入门QT6之QT前置知识扫盲(一)
132 0
|
3月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
3月前
|
API
Qt绘图之Paint系统
Qt绘图之Paint系统
61 2
|
3月前
从源码角度分析Qt元对象系统2
从源码角度分析Qt元对象系统
55 0

推荐镜像

更多
下一篇
无影云桌面