QPainter绘图与QPen、QFont及QBrush详细用法

一.基本绘图属性:

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图片

  1. QPrinter用法

(1)QPrinter printer;

printer.setOutputFormat(QPrinter::PdfFormat); // 设置输出格式为PDF,也可以其他格式

    printer.setOutputFileName("output.pdf"); // 设置输出文件名

    QPainter painter1(&printer);

    painter1.drawText(100, 100, "Hello, PDF1!");

    painter1.end(); // 结束绘制,内容将被发送到打印机

  1. 注意:

     用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479386.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云 OSS

阿里云对象存储服务&#xff08;Object Storage Service&#xff0c;简称 OSS&#xff09; OSS 为 Object Storage Service&#xff0c;即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 OSS 具有与平台无关的 RESTful API 接口&#xff0c;可以在任…

深度学习(16)--基于经典网络架构resnet训练图像分类模型

目录 一.项目介绍 二.项目流程详解 2.1.引入所需的工具包 2.2.数据读取和预处理 2.3.加载resnet152模型 2.4.初始化模型 2.5.设置需要更新的参数 2.6.训练模块设置 2.7.再次训练所有层 2.8.测试网络效果 三.完整代码 一.项目介绍 使用PyTorch工具包调用经典网络架构…

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用&#xff1a;避免写一大堆的import&#xff0c;比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

项目发布前如何打tag标签及标签命名规范

项目发布前如何打tag标签及标签命名规范 1.问题背景 我们知道git分支可以理解为一系列提交流水组成的线&#xff0c;如果我们开发的项目到了一个比较重要的阶段&#xff0c;比如项目发布上线&#xff0c;处于方便后期代码的追溯和维护的考虑&#xff0c;如何在繁杂的日志提交…

一般小红书种草达人多少钱,投放注意事项

在互联网时代&#xff0c;小红书成为了广大消费者了解、评价和分享美妆、服饰、生活方式等方面的平台之一。平台上诸多用户的种草帖&#xff0c;已经成为了很多人发现新品、了解产品真实情况的重要渠道。同时众多品牌也纷纷加入了进来&#xff0c;今天我们和大家来分享下一般小…

力扣面试150 验证回文串 双指针 Character API

Problem: 125. 验证回文串 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 Character.isLetterorDigit(char c)&#xff1a;判读字符 c 是否是字母或者数字 Character.toLowerCase(char c)&#xff1a;将字符 c 转换为小写字母 复杂度 时间复杂度: …

51_蓝桥杯_数码管静态显示

一 电路 二 数码管静态显示工作原理 三 代码 代码1 实现第一个数码管显示数字6的功能 #include "reg52.h"unsigned char code SMG_Duanma[18] {0xc0,0xf9.0xa4,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc0,0x86,0x8e,0xbf,0x7f};void Delay(unsignde int t) {wh…

【微服务生态】Docker

文章目录 一、基础篇1. 简介2. 下载与安装3. 常用命令3.1 帮助启动类3.2 镜像命令3.3 容器命令 4. Docker 容器数据券5. Docker 镜像5.1 commit 生成镜像5.2 Docker Registry5.3 发布镜像 6. Docker 常规安装软件 二、高级篇1. Dockerfile1.1 概述1.2 基础知识1.3 Dockerfile常…

【大模型 向量库】从向量搜索到向量数据库

大模型向量库 向量&#xff1a;AI核心向量库&#xff1a;语义近似搜索大模型 向量库YOLO 向量数据库嵌入&#xff08;Embedding&#xff09;设计最近邻搜索近似近邻搜索 主流向量数据库Milvus 实践 向量&#xff1a;AI核心 向量伴随着 AI 模型的发展而发展。 向量&#xff…

LLM Note 1

文章目录 Speculative decoding(sampling)重复Beam searchContrastive searchHallucinationEmbbeding overlappep简单例子vector space overlappedTop K, Top P, TemperatureMOESpeculative decoding(sampling) (感谢 Efficient NLP) 以下的内容,主要帮助decoding高质量…

软件安装遇到bug、报错不知道怎么解决?赶紧收藏起来!

前言 本文举例了几个常见的软件工具使用问题&#xff0c;文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上&#xff0c;我们不断学习、改进&#xff0c;更加坚定自己的技术信念。让我们相信&#xff0c;每一个 Bug 都是我们成长的机会。" 一、VM…

C++之C++输入输出流

目录 1、输入输出的含义 2、C输入输出机制 2.1、"流"的概念 2.2、C常用流类型 2.3、流类型之间的关系 2.4、流的状态 2.5、管理流的状态 2.6、流的通用操作 2.7、缓冲区 2.7.1、为什么要引入缓冲区呢&#xff1f; 2.7.2、缓冲区要做哪些工作&#xff1f; …