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

重写基类 QWidgetpaintEvent 虚函数。

override 关键字 :C++11 特性,告诉编译器"我明确要重写父类的虚函数"。如果父类没有这个函数,编译器会报错,防止你拼写错误(比如写成 paintevent)。

QPainter painter(this)

堆栈 上创建一个 QPainter 对象,并将当前窗口 this 作为绘图设备传递进去。

核心机制QPainter 必须在绘图设备(如 QWidgetQPixmap)的 paintEvent 中创建。创建后,它会自动与窗口的底层画布建立连接。后续所有的 drawLinedrawRect 都是对这个 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 就会用这个字体写字。

运行结果

相关推荐
西西弗Sisyphus4 小时前
Qt 实现一个 Windows 启动项查看器
开发语言·windows·qt
郝学胜-神的一滴17 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
爱吃巧克力的程序媛20 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
励志不掉头发的内向程序员1 天前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互
尘中远1 天前
给C++工业软件搭建 Agent
开发语言·c++·qt·ai·agent
Quz1 天前
QML Page:把 Page 装进切换容器里
qt
秋田君1 天前
Qt_串口编程
开发语言·qt
励志不掉头发的内向程序员1 天前
【LibreCAD 2D架构】从两个坐标到图形实体:RS_ActionDrawLine如何创建RS_Line
开发语言·c++·qt·学习·系统架构
似水এ᭄往昔1 天前
【Qt】--常用控件(按钮类控件)
开发语言·qt