【QT】基本的绘图操作和高级绘图

基本绘图

新建项目

重新绘图事件

画基本图形

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

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

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

// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    // 创建画家
    // this表示绘图设备,往当前窗口画画
    QPainter painter(this);
    painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线
    painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)
    painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形
}

效果

写字

    // 写字
    painter.setFont(QFont("华文彩云", 20));         // 设置字体字号
    painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");

效果

设置画笔颜色、宽度、风格

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

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

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

// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    // 创建画家
    // this表示绘图设备,往当前窗口画画
    QPainter painter(this);

    // 指定画笔
    QPen pen(QColor(255, 0, 0));
    // 设置画笔的宽度
    pen.setWidth(3);        // 默认是1
    // 设置画笔风格
    pen.setStyle(Qt::DotLine);
    // 画家使用画笔
    painter.setPen(pen);

    painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线
    painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)
    painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形


    // 写字
    painter.setFont(QFont("华文彩云", 20));         // 设置字体字号
    painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");

}

效果

画刷,可以填充封闭的图案
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

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

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

// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    // 创建画家
    // this表示绘图设备,往当前窗口画画
    QPainter painter(this);

    // 指定画笔
    QPen pen(QColor(255, 0, 0));
    // 设置画笔的宽度
    pen.setWidth(3);        // 默认是1
    // 设置画笔风格
    pen.setStyle(Qt::DotLine);
    // 画家使用画笔
    painter.setPen(pen);


    // 画刷,可以填充封闭的图案
    QBrush brush(Qt::cyan);         // 青色
    // 设置画刷风格
    brush.setStyle(Qt::Dense5Pattern);
    // 画家使用画刷
    painter.setBrush(brush);



    painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线
    painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)
    painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形


    // 写字
    painter.setFont(QFont("华文彩云", 20));         // 设置字体字号
    painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");

}

效果

高级绘图

设置抗锯齿

    painter.drawEllipse(QPoint(100, 100), 50, 50);          // 画圆

    // 设置抗锯齿
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(250, 100), 50, 50);          // 画圆

效果

移动画家

    painter.drawRect(QRect(20, 20, 50, 50));
    // 移动画家
    painter.translate(100, 0);
    painter.save();                 // 保存
    painter.drawRect(QRect(20, 20, 50, 50));
    painter.translate(100, 0);
    painter.restore();              // 恢复到100处
    painter.drawRect(QRect(20, 20, 50, 50));

效果

画成品图,导入资源:【QT】资源文件导入_复制其他项目中的文件到qt项目中_StudyWinter的博客-CSDN博客

代码

    // 画成品的图案
    QPixmap pix;
    pix.load(":/Image/Luffy.png");
    painter.drawPixmap(0, 0, pix);

效果

在UI文件中加pushbutton,点击button,图片移动。

加入成员变量记录坐标信息

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

    // 点击移动按钮,图片移动
    connect(ui->pushButton, &QPushButton::clicked, this, [=]() {
        posX += 10;
        // 重新画图,手动调用
        update();       // 自动调用paintEvent

    });
}

效果

图片左边出去,可以从右边回来

    // 画成品的图案
    QPixmap pix;
    pix.load(":/Image/Luffy.png");
    // 窗口的宽度
    if (posX > this->width()) {
        // 重置
        posX = 0 - pix.width();
    }
    painter.drawPixmap(posX, 0, pix);

效果

图片自动移动,利用定时器

    // 图片自动移动
    QTimer* time = new QTimer(this);
    time->start(10);
    connect(time, &QTimer::timeout, this, [=]() {
        posX++;
        update();
    });

所有代码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    // 重写绘图事件
    void paintEvent(QPaintEvent *event);

    // 记录坐标
    int posX;

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPushButton>
#include <QTimer>

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

    // 点击移动按钮,图片移动
    connect(ui->pushButton, &QPushButton::clicked, this, [=]() {
        posX += 10;
        // 重新画图,手动调用
        update();       // 自动调用paintEvent

    });


    // 图片自动移动
    QTimer* time = new QTimer(this);
    time->start(10);
    connect(time, &QTimer::timeout, this, [=]() {
        posX++;
        update();
    });
}

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

// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    // 创建画家
    // this表示绘图设备,往当前窗口画画
    QPainter painter(this);

    /***************************************基本绘图**************************************/

//    // 指定画笔
//    QPen pen(QColor(255, 0, 0));
//    // 设置画笔的宽度
//    pen.setWidth(3);        // 默认是1
//    // 设置画笔风格
//    pen.setStyle(Qt::DotLine);
//    // 画家使用画笔
//    painter.setPen(pen);


//    // 画刷,可以填充封闭的图案
//    QBrush brush(Qt::cyan);         // 青色
//    // 设置画刷风格
//    brush.setStyle(Qt::Dense5Pattern);
//    // 画家使用画刷
//    painter.setBrush(brush);

//    painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线
//    painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)
//    painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形


//    // 写字
//    painter.setFont(QFont("华文彩云", 20));         // 设置字体字号
//    painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");



    /*****************************************高级绘图****************************************/
//    painter.drawEllipse(QPoint(100, 100), 50, 50);          // 画圆

//    // 设置抗锯齿
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse(QPoint(250, 100), 50, 50);          // 画圆

//    painter.drawRect(QRect(20, 20, 50, 50));
//    // 移动画家
//    painter.translate(100, 0);
//    painter.save();                 // 保存
//    painter.drawRect(QRect(20, 20, 50, 50));
//    painter.translate(100, 0);
//    painter.restore();              // 恢复到100处
//    painter.drawRect(QRect(20, 20, 50, 50));


    // 画成品的图案
    QPixmap pix;
    pix.load(":/Image/Luffy.png");
    // 窗口的宽度
    if (posX > this->width()) {
        // 重置
        posX = 0 - pix.width();
    }
    painter.drawPixmap(posX, 0, pix);




}

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值