一.基本绘图属性:
1.基本绘图类:
Qt的绘图功能基于QPainter、QPainterDevice和QPainterEngine三个类。QPainter类在窗口和其他绘制设备上执行低级绘制。它提供高度优化的功能来完成大多数图形用户界面程序所需的工作,包括绘制基本的点、线、圆等基本形状,以及复杂的形状如饼图和弦等。此外,QPainter还能绘制对齐的文本和像素图。
QPaintDevice类表示QPainter的绘图设备,QPainter能在QPaintDevice的子类上进行图形绘制,QpaintDevice子类包含QImage、QOpenGLPaintDevice、QWidget、QPixmap、PixelBuffer、QGLFramebufferObject、QPicture、QPrinter。
2.绘图事件:
void wiget::paintEvent(QPaintEvent *event){}
QPainter只能在paintEvent中进行绘图。paintEvent事件在窗口刷新时触发,如最大化最小化,拖动窗口边缘时也会触发。
3.主要属性:
(1) QPen:控制线条颜色宽度线性。
(2) QBrush:设置一个区域的填充特性。
(3) QFont:用于绘制文字。
(4) QPixmap: 绘制图片,适合小图片。
(5) QImage: 绘制图片,适合大图片。
(6) QBitmap: QPixmap的一个子类,单通道图。
(7) QPicture: 一张画布,可以用于保存、读取Qpainter的绘图。
(8)QPrinter类是一个在打印机上绘制的绘图设备。它允许你将图形输出到打印机,生成打印预览,或者直接生成PDF文件。
4.基本图形绘制函数:
drawPoint() //画点
drawLine() //画直线
drawRect() //画矩形
drawArc() //画圆弧
drawEllipse() //画椭圆
drawPie() //画扇形
drawPolygon() //画多边形
drawChord() //画弦
drawRoundedRect() //画圆角矩形
drawPolyline() //画折线
drawConvexPolygon() //画凸多边形
二.重点绘图属性类介绍
1.QFont的一些属性与功能:
QFont是Qt框架中用于描述字体属性的工具类。
设置属性:
void setFamily(const QString &family);
void setPointSize(int size);
void setWeight(int weight);
void setItalic(bool italic);
void setUnderline(bool underline);
获取属性:
QString family() const;
int pointSize() const;
int weight() const;
bool italic() const;
bool underline() const;
2.QPen的一些属性与功能:
主要函数:
//函数原型 功能
void setColor(QColor &color) //设置画笔颜色
void setWidth(int width) //设置线条宽度
void setStyle(Qt::PenStyle style) //设置线条样式,参数为Qt::PenStyle枚举类型
void setCapStyle(Qt::PenCapStyle style) //设置线条端点样式,参数为Qt::PenCapStyle枚举类型
void setJoinStyle(Qt::PenJoinStyle style)//设置连接样式,参数为Qt::PenJoinStyle枚举类型
属性修改后,需要使用setPen()来应用于绘图。
(1)线条样式:
Qt::NoPen //没有画笔,设置此属性时,用画笔不会画出任何东西。但是画刷仍然有效,表现出来就是无边界,但有填充。
Qt::SolidLine //实线
Qt::DashLine //虚线
Qt::DotLine //点状线
Qt::DashDotLine //虚线和点交替
Qt::DashDotDotLine //虚线和双点交替
Qt::CustomDashLine //自定义样式
(2)线条端点样式:
Qt::FlatCap //平顶端点
Qt::SquareCap //方形端点
Qt::RoundCap //圆形端点
(3)线条连接样式:
Qt::BevelJoin //斜切连接
Qt::MiterJoin //直角连接
Qt::RoundJoin //圆连接
3.QBrush的一些属性与功能:
主要函数:
//函数原型 功能
void setColor(QColor &color) //设置画刷颜色
void setStyle(Qt::BrushStyle style) //设置画刷样式
void setTexture(QPixmap &pixmap) //设置一个QPixmap图片作为画刷的图片
void setTextureImage(QImage &image) //设置一个QImage类型的图片作为画刷的图片
(1)基本填充和线性填充:
//枚举常量 描述
Qt::NoBrush //不填充
Qt::SolidPattern //单一颜色填充
Qt::HorPattern //水平线填充
Qt::VerPattern //垂直线填充
(2)渐变填充:
Qt::LinearGradientPattern //线性渐变,需要使用QLinearGradient类对象作为Brush
Qt::RadialGradientPattern //辐射渐变,需要使用QRadialGradient类对象作为Brush
Qt::ConicalGradientPattern //圆锥型渐变,需要使用QConicalGradient类对象作为Brush
Qt::TexturePattern //材质填充,需要指定texture或textureImage图片
- QPrinter用法
(1)QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat); // 设置输出格式为PDF,也可以其他格式
printer.setOutputFileName("output.pdf"); // 设置输出文件名
QPainter painter1(&printer);
painter1.drawText(100, 100, "Hello, PDF1!");
painter1.end(); // 结束绘制,内容将被发送到打印机
- 注意:
用QPrinter需要添加QT += printsupport;
当设置QPainter painter1(&printer)后,绘制图形输出到pdf文件,就不会再输出到ui页面上了。
三.代码示例
1.widget.h
在mianwindow.h中引入QPainter及其他常用模块:
#include <QPainter>
#include <QPrinter>
#include <QBitmap>
#include <QPixmap>
#include <QPicture>
声明Qpainter事件:
protected:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
//Q_DECL_OVERRIDE表示这个函数是对父类虚函数的重载
2.widget.cpp
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
//画线
painter.drawLine(QPoint(0,0),QPoint(100,100));
//创建画笔
QPen pen(Qt::green,5,Qt::DotLine,Qt::RoundCap,Qt::RoundJoin);
painter.setPen(pen);
QRectF rectangle(70.0,40.0,80.0,60.0);
int startAngle=30*16;
int spanAngle=120*16;
painter.drawArc(rectangle,startAngle,spanAngle);
pen.setWidth(1);
pen.setStyle(Qt::SolidLine);
painter.setPen(pen);
//绘制一个矩形
painter.drawRect(160,20,50,40);
//创建画刷
QBrush brush(QColor(0,0,255),Qt::Dense4Pattern);
//使用画刷
painter.setBrush(brush);
//绘制画刷
painter.drawEllipse(220,20,50,50);
//设置纹理
brush.setTexture(QPixmap("abc.png"));
//重新使用画刷
painter.setBrush(brush);
//定义四个点
static const QPointF points[4]={
QPointF(270.0,80.0),
QPointF(290.0,10),
QPointF(350.0,30),
QPointF(390.0,50)
};
painter.drawPolygon(points,4);
painter.fillRect(QRect(10,100,150,20),QBrush(Qt::darkYellow));
painter.eraseRect(QRect(50,0,50,120));
//线性渐变
QLinearGradient linearGradient(QPointF(40,190),QPointF(70,190));
//插入颜色
linearGradient.setColorAt(0,Qt::yellow);
linearGradient.setColorAt(0.5,Qt::red);
linearGradient.setColorAt(1.0,Qt::green);
//指定渐变区域以外的区域的扩散方式
linearGradient.setSpread(QGradient::RepeatSpread);
//使用渐变作为画刷
painter.setBrush(linearGradient);
painter.drawRect(10,170,90,40);
//辐射渐变
QRadialGradient radialGradient(QPointF(200,190),50,QPointF(275,200));
radialGradient.setColorAt(0,QColor(255,255,100,150));
radialGradient.setColorAt(1,QColor(0,0,0,50));
painter.setBrush(radialGradient);
painter.drawEllipse(QPointF(200,190),50,50);
//锥形渐变
QConicalGradient conicalGradient(QPointF(350,190),60);
conicalGradient.setColorAt(0.2,Qt::cyan);
conicalGradient.setColorAt(0.9,Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPointF(350,190),50,50);
//画笔使用线性渐变来绘制直线和文字
painter.setPen(QPen(linearGradient,2));
painter.drawLine(0,280,100,280);
painter.drawText(150,280,tr("helloQt"));
//添加文字
QFont font1;
font1.setPixelSize(24); //设置字体像素大小为12
QString text="hello"; //设置显示的文本
QFontMetrics metrics(font1); //获取文字宽度对象
int w=metrics.width(text); //获取显示文本的宽度
int h=metrics.height(); //获取显示文本的高度
painter.setFont(font1);
painter.setPen(Qt::blue);
painter.drawText(QRect(this->width()/2-w,this->height()/2-h,w,h),text);
//绘图打印功能
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat); // 设置输出格式为PDF,也可以设置为其他格式
printer.setOutputFileName("output.pdf"); // 设置输出文件名
QPainter painter1(&printer);
painter1.drawText(100, 100, "Hello, PDF1!");
painter1.end(); // 结束绘制,内容将被发送到打印机
}
完整工程代码可在本博客资源中下载:
https://download.csdn.net/download/xieliru/88848340?spm=1001.2014.3001.5501
四.绘制结果
参考文章:https://blog.csdn.net/qq_36780295/article/details/112791230