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 就会用这个字体写字。

运行结果

相关推荐
奇树谦2 天前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
BroNekoX3 天前
我将基于 QtQuick 框架开发的音乐播放器性能做到顶级
qt
小小晓.3 天前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
扶尔魔ocy4 天前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
lhbweilai4 天前
QT项目(串口助手)
开发语言·qt
小鱼仙官5 天前
Qt 主界面弹出分界面
开发语言·qt
誰能久伴不乏5 天前
用 UDP 做一条“可靠“的控制通道
c++·qt·网络协议·udp
Bczheng15 天前
VS2022 安装MFC和QT
c++·qt·mfc
会编程的小孩5 天前
8.19号函数
qt
蓝祁子yoky6 天前
Qt学习日记 Day15:网络编程(二)- UDP基础
网络·qt·学习