1. 从零开始:理解Qt绘图的核心四要素
大家好,我是老张,一个在Qt和图形界面开发领域摸爬滚打了十多年的老程序员。今天我想和你聊聊Qt里最基础也最强大的绘图工具——QPainter。很多刚接触Qt的朋友,一看到绘图就觉得头大,觉得这是图形学专家才玩得转的东西。其实不然,Qt把绘图这件事封装得特别友好,你完全可以把QPainter想象成一个现实世界里的画家,理解起来就轻松多了。
在Qt的绘图世界里,有四个核心角色,我习惯把它们叫做“绘图四要素”:
- QPainter(画家):这是干活的主角。它手里拿着画笔和画刷,负责执行具体的绘图指令,比如“在这里画一条线”、“在那里画个圆”。
- QPaintDevice(画板):这是画家作画的地方。它可以是你的程序窗口(QWidget),也可以是一张内存中的图片(QPixmap、QImage),甚至是打印机。你告诉画家在哪个画板上作画。
- QPen(画笔):控制线条的样式。线条是什么颜色?多粗?是实线还是虚线?这些都由画笔说了算。
- QBrush(画刷):负责填充封闭图形的内部。比如画一个圆,你是想把它涂成纯色,还是用渐变色填充,或者用某种纹理图案?这就是画刷的工作。
这四者的关系非常直观:画家(QPainter)拿着画笔(QPen)和画刷(QBrush),在画板(QPaintDevice)上进行创作。 记住这个比喻,后面所有的操作你都会觉得顺理成章。
那么,画家什么时候开始工作呢?这就引出了绘图的关键事件——paintEvent。你不能在程序初始化的时候(比如构造函数里)画图,因为窗口可能被遮挡、最小化或者改变大小,这些操作都会导致之前画的内容被擦除。Qt设计得非常聪明,它会在需要重画的时候自动调用paintEvent函数。所以,我们所有的绘图代码,都必须写在这个函数的重写版本里。当你想手动触发重画时,调用update()函数即可,它会通知系统:“嘿,我的界面需要刷新了”,然后paintEvent就会被调用。
2. 基础绘图实战:从线条到文字
理论说再多不如动手试一次。我们来创建一个最简单的Qt Widgets应用项目,然后重写主窗口的paintEvent函数。别担心,代码非常简单。
2.1 绘制基本图形
首先,我们让画家画一些最基本的形状:直线、矩形和圆。在paintEvent函数里,我们创建一个指向当前窗口的画家对象,然后直接调用它的绘图方法。
void Widget::paintEvent(QPaintEvent *event)
{
// 创建一个画家,并指定画板为当前窗口(this)
QPainter painter(this);
// 画一条从(0,0)到(100,100)的直线
painter.drawLine(QPoint(0, 0), QPoint(100, 100));
// 画一个圆:圆心在(100,100),半径50像素
painter.drawEllipse(QPoint(100, 100), 50, 50);
// 画一个矩形:左上角在(20,20),宽50像素,高50像素
painter.drawRect(QRect(20, 20, 50, 50));
}
运行一下,你会看到窗口上出现了黑色的线条和图形轮廓。这就是Qt绘图的默认样式。你可能注意到了,圆和矩形只有边框,里面是空的。这是因为我们还没请出“画刷”这位填充大师。
2.2 玩转画笔与画刷
默认的黑色细线看久了难免单调。现在,让我们给画家配上一支更漂亮的画笔。我们创建一个红色的画笔,把它设置成3像素宽的虚线。
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// 1. 定制一支画笔
QPen pen(QColor(255, 0, 0)); // 红色
pen.setWidth(3); // 宽度3像素
pen.setStyle(Qt::DotLine); // 点线样式
painter.setPen(pen); // 画家使用这支笔
// 2. 使用画刷填充图形内部
QBrush brush(Qt::cyan); // 青色画刷
brush.setStyle(Qt::Dense5Pattern); // 使用密集的点状图案填充
painter.setBrush(brush); // 画家使用这个画刷
// 现在再画图形,效果就不同了


378

被折叠的 条评论
为什么被折叠?



