前两篇QT从入门到实战x篇_25_event事件分发器(用于事件的分发;也可以做拦截操作,不建议;bool event(QEvent* e);返回值如果是true代表用户处理这个事件,不向下分发了),QT从入门到实战x篇_26_事件过滤器eventfilter(在程序将事件分发到事件分发器前,可以利用过滤器拦截;步骤2步:给控件安装事件过滤器、重写eventfilter事件)介绍了Qt中的事件分发器和过滤器,本篇介绍绘图事件QPainter
的使用方法。
总结:
- 绘图事件
void painterEvent();
- 声明一个画家对象
QPainter painter(this) this
指定绘图设备 - 画线、画圆、画矩形、画文字
- 设置画笔
QPen
设置画笔宽度 风格 - 设置画刷
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");
}