Qt 学习第 天:QPainter类

一、先创建一个widget窗口

二、包含头文件

#include <QPainter>

#include <QFont>

三、在widget.h中声明paintEvent函数

使用画家类在窗口中画图, 操作必须在paintEvent函数中完成

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    /*
     *  此函数不需要调用, 再刷新的时候会自动调用
     *  什么时候窗口刷新:
     *      1. 窗口显示的时候
     *      2. 最大化, 最小化
     *      3. 窗口被这遮挡, 重新显示的时候
     *      4. 用户强制刷新的时候
     *      5. ...........
     *  如果想使用画家类在窗口中画图, 操作必须在paintEvent函数中完成
    */
    void paintEvent(QPaintEvent *);

private:
    Ui::Widget *ui;
    int x;
};

#endif // WIDGET_H

四、在paintEvent函数中画图与写字

创建画家类对象和创建新画笔

cpp 复制代码
// 创建画家类对象
    QPainter painter(this);   // 指定绘图设备
    // 画家要有画笔才能画画
    // 创建新画笔 -- 轮廓
    QPen pen;
    pen.setColor(QColor(0, 255, 0)); /*Qt::green*/
    pen.setWidth(10);   // 像素
    pen.setStyle(Qt::DotLine);

// 将新画笔设置给画家类
    painter.setPen(pen);

画直线

painter.drawLine(QPoint(100, 100), QPoint(300, 500)); //从A点坐标到B点坐标

画椭圆

painter.drawEllipse(QPoint(200, 200), 100, 50); //中心点坐标,rx,ry

画矩形

painter.drawRect(400, 200, 200, 200); //矩形左上角坐标x,y,宽,高

写字

cpp 复制代码
// 写字
    QFont font("华文彩云", 48, 75, true);
    painter.setFont(font);
    painter.drawText(100, 600, "我是中国人, 我爱我的祖国!!!");

【运行结果】

画刷

cpp 复制代码
// 闭合区域使用画刷
    QBrush brush(QPixmap(":/Image/face.png"));
    painter.setBrush(brush);
    painter.drawRect(400, 200, 400, 400);

画背景图

painter.drawPixmap(0, 0, QPixmap(":/Image/xks.png"));

【运行结果】

五、刷新窗口调用paintEvent函数实现移动图像

widget.h文件

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void paintEvent(QPaintEvent *);

private:
    Ui::Widget *ui;
    int x;
};

#endif // WIDGET_H

widget.cpp文件

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QFont>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    x = 20;
    ui->setupUi(this);

    connect(ui->move, &QPushButton::clicked, this, [=]()
    {
       // 刷新窗口
        update();   // 系统调用paintEvent 函数
    });
}

Widget::~Widget()
{
    delete ui;
}


void Widget::paintEvent(QPaintEvent *)
{

    // 创建画家类对象
    QPainter painter(this);   // 指定绘图设备
    // 画家要有画笔才能画画
    // 创建新画笔 -- 轮廓
    QPen pen;
    pen.setColor(QColor(0, 255, 0)); //Qt::green
    pen.setWidth(10);   // 像素
    pen.setStyle(Qt::DotLine);

    // 将新画笔设置给画家类
    painter.setPen(pen);
/*
    // 画直线
    painter.drawLine(QPoint(100, 100), QPoint(300, 500));
    // 画椭圆
    painter.drawEllipse(QPoint(200, 200), 100, 50);
    // 画矩形
    painter.drawRect(400, 200, 200, 200);
    // 写字
    QFont font("华文彩云", 48, 75, true);
    painter.setFont(font);
    painter.drawText(100, 600, "我是中国人, 我爱我的祖国!!!");
*/

    // 闭合区域使用画刷
    QBrush brush(QPixmap(":/Image/face.png"));
    painter.setBrush(brush);
    painter.drawRect(400, 200, 400, 400);

    // 画背景图
    // painter.drawPixmap(0, 0, QPixmap(":/Image/xks.png"));

    // 提供笑脸
    x += 5;
    //超出边框会自动回到原位
    if(x > this->width())
    {
        x = 20;
    }
    painter.drawPixmap(x, 100, QPixmap(":/Image/sunny.png"));

}

【运行结果】

相关推荐
GIS数据转换器35 分钟前
地下空间综合管廊运营管理平台
大数据·开发语言·人工智能·经验分享·perl
Wang's Blog6 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
砚底藏山河6 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年6 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym7 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen7 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室7 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
quantdash_cc7 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun7 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统
把我格子衫拿来7 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化