Qt学习之绘图入门练习

今天学习基础的运用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 就会用这个字体写字。

运行结果

相关推荐
实心儿儿3 小时前
Qt — Qt 事件
开发语言·qt
bkspiderx10 小时前
Qt 的消息机制:事件驱动与信号槽的底层逻辑
开发语言·qt·信号槽·事件驱动·qt 的消息机制
江湖人称菠萝包11 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter11-数据库
笔记·qt·qt5
励志不掉头发的内向程序员12 小时前
【从零写一个CAD 02】画完第一条线之后:实体容器、Esc 取消,和按了没反应的键盘
开发语言·c++·qt·学习·系统架构
Quz17 小时前
QML TreeView:排序与搜索过滤
qt
Quz18 小时前
QML TreeView:基础树视图与自定义委托
qt
Junfeng的技术笔记1 天前
基于 C++/Qt 的雷达回波信号检测与测距仿真系统
qt
Quz1 天前
QML TableView:自定义样式与排序表格
qt
Quz1 天前
QML TableView:可编辑表格与 SQLite 数据持久化
qt·sqlite
Quz1 天前
QML ListView:C++ 数据模型与 ProxyModel 实时过滤
qt