第一部分:基础知识点
Qt的二维绘图基本功能是使用QPainter在绘图设备上绘图,绘图设备包括QWidget,QPixmap等,通过绘制一些基本的点,线,圆等基本形状组成自己想要的图形,得到的图形是不可交互操作的图形。
绘图系统基于QPainter,QPaintDevice和QPainterEngine类。QPainter是用来进行绘图操作的类,QPainterDevice是一个可以使用QPainter进行绘图的抽象的二维界面,QPainterEngine给QPainter提供在不同设备上绘图的接口。QPainterEngine类由QPainter和QPainterDevice内部使用,应用程序一般无须和QPainterEngine打交道,除非创建自己的设备类型。
绘图设备:
QWidget,QPixmap,QImage等,这些绘图设备为QPainter提供一个画布
paintEvent事件和绘图区
QWidget类及其子类是最常用的绘图设备,从QWidget类继承的类都有paintEvent()事件,要在设备上绘图,只需重定义此事件并编写响应代码。创建一个QPainter对象获取绘图设备的接口,然后就可以在绘图设备的画布上绘图了。
基本程序结构是:
void widget::paintEvent(QpaintEvent *event)
{
QPainter painter(this);//创建与绘图设备关联的QPainter对象
...//painter在设备的窗口上画图
}
窗口的左上角为(0,0),向右是X轴正方向,向下是Y轴的正方向。宽度由QWidget::width()函数获取,长度由QWidget::height()函数获取
属性:
pen属性: 是一个QPen对象,用于控制线条的颜色,宽度,线型等
brush属性:QBrush 笔刷,设置一个区域的填充特性,可以设置填充颜色,填充方式,渐变特性等。还可以采取图片做材质填充。
font属性:是一个QFont对象,用于绘制文字时,设置文字的字体样式,大小等属性。
QBrush:
void setColor(QColor &color) 设置画刷颜色,实体填充时即为填充颜色
void setStyle(Qt::BrushStyle style) 设置画刷样式,参数为Qt::BrushStyle枚举类型
void setTexture(QPixmap &pixmap) 设置一个QPixmap类型的图片作为画刷的照片,画刷样式自动设置为Qt::TexturePattern
void setTextureImage(QImage &image) 设置一个QImage类型的图片作为画刷的图片,画刷样式自动设置为Qt::TexturePattern
第二部分:实战练习
目的:使用画笔话一个矩形,内部用黄色填充。
新建一个Qt项目,选择QWidget。在Widget.h文件中声明paintevent()函数,然后在.cpp中实现就行了。
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QPainter>
#include<QPaintEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void paintEvent(QPaintEvent *event) override;
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
构造函数widgte():
ui->setupUi(this);
setPalette(QPalette(Qt::white));//设置窗口为白色背景
setAutoFillBackground(true);
paintEvent()函数的实现:
QPainter painter(this);//创建QPainter对象
painter.setRenderHint(QPainter::Antialiasing);//告诉绘图引擎应该在可能的情况下进行边的反锯齿绘制
painter.setRenderHint(QPainter::TextAntialiasing);//尽可能的情况下文字的反锯齿绘制
int w = this->width();//绘图区的宽度
int h = this->height();//绘图区的高度
QRect rect(w/4,h/4,w/2,h/2);//中间区域矩形框,前两个参数是绘图区的起始坐标,后两个参数绘图区的宽度和高度
//设置画笔 必须得最后将画笔设置进painter对象中
QPen pen;
pen.setWidth(3);//线宽
pen.setColor(Qt::red);//划线颜色
pen.setStyle(Qt::SolidLine);//实线
pen.setCapStyle(Qt::FlatCap);//线端点样式
pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式
painter.setPen(pen);
//设置画刷 必须得最后将画刷设置进painter对象中
QBrush brush;
brush.setColor(Qt::yellow);//画刷颜色
brush.setStyle(Qt::SolidPattern);//画刷填充样式
painter.setBrush(brush);
//绘图
painter.drawRect(rect);
这里注意下,将画笔和画刷设置进painter中前,必须将其属性设置完全。在将画笔/画刷设置进painter后,在修改其值不会该变设置进去的状态。