QT从入门到实战x篇_27_绘图事件QPainter(绘图事件void painterEvent();声明一个画家对象 QPainter painter(this);画笔QPen;画刷QBrush)

前两篇QT从入门到实战x篇_25_event事件分发器(用于事件的分发;也可以做拦截操作,不建议;bool event(QEvent* e);返回值如果是true代表用户处理这个事件,不向下分发了)QT从入门到实战x篇_26_事件过滤器eventfilter(在程序将事件分发到事件分发器前,可以利用过滤器拦截;步骤2步:给控件安装事件过滤器、重写eventfilter事件)介绍了Qt中的事件分发器和过滤器,本篇介绍绘图事件QPainter的使用方法。

总结:

  1. 绘图事件 void painterEvent();
  2. 声明一个画家对象 QPainter painter(this) this指定绘图设备
  3. 画线、画圆、画矩形、画文字
  4. 设置画笔QPen 设置画笔宽度 风格
  5. 设置画刷QBrush 设置画刷 风格

1. 首先创建名为“03_QPainter”的widget程序

在这里插入图片描述

2. 利用绘图事件进行“画画”

  • widget.h
    //绘图事件
    void paintEvent(QPaintEvent *);
  • widget.cpp
    重写绘图事件
#include <QPainter> //画家类

void Widget::paintEvent(QPaintEvent *)
{
    //实例化画家对象 this指定绘图的设备(在当前窗口中画画)
    QPainter painter(this);

    //绘制指定坐标点的直线
    painter.drawLine(QPoint(0,0),QPoint(100,100));
}

运行结果:
在这里插入图片描述
重写paintEvent(QPaintEvent *)之后,系统调用重写的函数,如果未重写将会调用空实现,参考C++57个入门知识点_48 接口类+纯虚函数与抽象类(接口类:父类只是为了子类提供接口,规范子类对外使用的接口;包含纯虚函数的类成为抽象类;接口类可以是抽象类也可以不是;纯虚析构一定要有实现)

  • 对应的绘制圆、矩形、写文字的代码如下:
void Widget::paintEvent(QPaintEvent *)
{
    //实例化画家对象 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.drawText(QRect(10,200,150,50),"good good study");
}

运行结果:
在这里插入图片描述

3. 设置画笔QPen设置画笔宽度 风格


目前绘制出来的均为黑色的默认线条,当想要给画家使用的这只笔设置属性,可以使用如下代码,需要注意相关属性的设置都是要在绘制之前完成。

void Widget::paintEvent(QPaintEvent *)
{
   //实例化画家对象 this指定绘图的设备(在当前窗口中画画)
    QPainter painter(this);

    //设置画笔
    //设置画笔颜色
    QPen pen(QColor(255,0,0));
    //设置画笔宽度
    pen.setWidth(3);
    //设置画笔风格
    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.drawText(QRect(10,200,150,50),"good good study");
}

运行结果:
在这里插入图片描述

4. 设置画刷QBrush设置画刷 风格


对于上图中矩形和圆的封闭图形,可以使用刷子进行填充,对应代码如下:

void Widget::paintEvent(QPaintEvent *)
{
    //实例化画家对象 this指定绘图的设备(在当前窗口中画画)
    QPainter painter(this);

    //设置画笔
    //设置画笔颜色
    QPen pen(QColor(255,0,0));
    //设置画笔宽度
    pen.setWidth(3);
    //设置画笔风格
    pen.setStyle(Qt::DotLine);
    //让画家使用这只笔
    painter.setPen(pen);

    //设置画刷
    QBrush brush(Qt::cyan);
    //设置画刷风格
    brush.setStyle(Qt::Dense7Pattern);
    //让画家使用画刷
    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.drawText(QRect(10,200,150,50),"good good study");
}

运行结果:
在这里插入图片描述
5.学习视频地址:QT从入门到实战x篇_27_绘图事件QPainter

整体代码:

  • widget.h
#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();

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

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
  • widget.cpp
#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 *)
{
    //实例化画家对象 this指定绘图的设备(在当前窗口中画画)
    QPainter painter(this);

    //设置画笔
    //设置画笔颜色
    QPen pen(QColor(255,0,0));
    //设置画笔宽度
    pen.setWidth(3);
    //设置画笔风格
    pen.setStyle(Qt::DotLine);
    //让画家使用这只笔
    painter.setPen(pen);

    //设置画刷
    QBrush brush(Qt::cyan);
    //设置画刷风格
    brush.setStyle(Qt::Dense7Pattern);
    //让画家使用画刷
    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.drawText(QRect(10,200,150,50),"good good study");
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值