今天学习基础的运用Qt进行绘图
cpp
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QPen>
#include <QBrush>
class PaintWidget : public QWidget
{
public:
PaintWidget(QWidget *parent = nullptr) : QWidget(parent) {}
protected:
void paintEvent(QPaintEvent *event) override
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿
// 1. 绘制直线
QPen pen(Qt::blue, 2);
painter.setPen(pen);
painter.drawLine(50, 50, 300, 50);
// 2. 绘制矩形
pen.setColor(Qt::red);
painter.setPen(pen);
painter.setBrush(QBrush(Qt::lightGray));
painter.drawRect(50, 80, 100, 80);
// 3. 绘制圆形
pen.setColor(Qt::green);
painter.setPen(pen);
painter.setBrush(QBrush(Qt::yellow));
painter.drawEllipse(200, 80, 80, 80);
// 4. 绘制文字
pen.setColor(Qt::black);
painter.setPen(pen);
painter.setFont(QFont("微软雅黑", 14, QFont::Bold));
painter.drawText(50, 220, "Qt 绘图练习:QPainter 基础");
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
PaintWidget window;
window.setWindowTitle("练习9:绘图基础");
window.resize(400, 280);
window.show();
return app.exec();
}
重要方法
void paintEvent(QPaintEvent *event) override
重写基类 QWidget 的 paintEvent 虚函数。
override 关键字 :C++11 特性,告诉编译器"我明确要重写父类的虚函数"。如果父类没有这个函数,编译器会报错,防止你拼写错误(比如写成 paintevent)。
QPainter painter(this)
在堆栈 上创建一个 QPainter 对象,并将当前窗口 this 作为绘图设备传递进去。
核心机制 :QPainter 必须在绘图设备(如 QWidget、QPixmap)的 paintEvent 中创建。创建后,它会自动与窗口的底层画布建立连接。后续所有的 drawLine、drawRect 都是对这个 painter 对象进行操作。
painter.setRenderHint(QPainter::Antialiasing)
开启**抗锯齿(Antialiasing)**渲染提示。
效果:如果没有这行,画斜线或圆形的边缘会有明显的"锯齿"(马赛克状)。开启后,边缘像素会进行颜色平滑过渡,图形看起来更圆润、专业。
QPen pen(Qt::blue, 2)
创建一个 QPen 对象,名为 pen。
参数解析 :Qt::blue 设置画笔颜色为蓝色,2 设置线条宽度为 2 像素。
painter.setPen(pen)
将创建好的 pen 设置给 painter(画家)。从此之后,画家使用的笔就变成了这支蓝色的 2 像素粗的笔。
painter.drawLine(50, 50, 300, 50)
在窗口上画一条直线。
参数解析 :(50, 50) 是起点的 X、Y 坐标,(300, 50) 是终点的 X、Y 坐标。这条线是从左上角(50,50) 到右边 (300,50) 的一条水平线。
painter.setBrush(QBrush(Qt::lightGray))
给画家设置一个画刷(Brush) ,颜色为浅灰色(Qt::lightGray)。
画刷用于填充封闭图形的内部(矩形、圆形)。这里使用了 QBrush 的构造函数直接传入颜色,生成了一个临时画刷对象并设置进去。
painter.drawRect(50, 80, 100, 80)
绘制一个矩形。
参数解析 :50, 80 是矩形左上角 的坐标。100 是矩形的宽度 (像素),80 是矩形的高度 。因为设置了红色画笔和浅灰色画刷,这个矩形会显示为红色边框 + 浅灰填充。
painter.drawEllipse(200, 80, 80, 80)
绘制一个椭圆(当宽高相等时就是正圆)。
参数解析 :200, 80 是椭圆外接矩形的左上角 坐标。第一个 80 是宽度,第二个 80 是高度。因为宽高相等,画出来就是一个直径为 80 像素的圆形。显示为绿色边框 + 黄色填充。
painter.setFont(QFont("微软雅黑", 14, QFont::Bold))
设置画家使用的字体。
参数解析 :"微软雅黑" 是字体名称;14 是字号(像素大小);QFont::Bold 是加粗样式。如果不设置,Qt 默认使用系统字体(通常较小且普通)。设置完后,后续的 drawText 就会用这个字体写字。
运行结果
