【QT】绘图API

news2024/11/21 1:34:11

        

目录

绘图API核心类 

第一步:重写paintEvent事件函数

第二步:创建QPainter

第三步:设置QPainter绘制的文字类型(非必须)

第四步:设置画笔属性(线条)

第五步:设置画刷的属性(填充)

第六步:开始绘制

绘制线段

绘制矩形

绘制圆形 

绘制文本

绘制图片

基础绘制

缩放绘制

图片旋转

图片平移


        前面介绍的Qt的各种控件,本质上都是画出来的,都是Qt已经提前画好的,拿过来就能使用,实际开发中,很可能出现现有的控件无法满足需求,需要自己diy一些控件/效果,Qt提供的绘图API就是为了解决上述问题的。

绘图API核心类 

说明
QPainter
"绘画者" 或者 "画家".
用来绘图的对象, 提供了⼀系列 drawXXX ⽅法, 可以允许我们绘制各种图
形.
QPaintDevice
“画板".
描述了 QPainter 把图形画到哪个对象上. 像咱们之前⽤过的 QWidget 也
是⼀种 QPaintDevice (QWidget 是 QPaintDevice 的⼦类)
QPen
”画笔".
描述了 QPainter 画出来的线是什么样的.
QBrush
"画刷".
描述了 QPainter 填充⼀个区域是什么样的.

画图相关的操作,一般不会放到QWidget的构造函数中调用执行,而是提供了一个paintEvent事件处理函数,在这里进行调用。

第一步:重写paintEvent事件函数

在头文件中声明paintEvent函数

void paintEvent(QPaintEvent *event);

 在.cpp文件中定义该函数

void Widget::paintEvent(QPaintEvent *event)
{
    //无实际意义,避免警告而已
    (void)event;
}

第二步:创建QPainter

QPainter painter(this);

第三步:设置QPainter绘制的文字类型(非必须)

QFont font("微软雅黑",24);
painter.setFont(font);

第四步:设置画笔属性(线条)

    //设置画笔属性
    QPen pen;
    //设置成蓝色的线条
    pen.setColor(QColor(0,0,255));
    //设置线条的粗细
    pen.setWidth(5);
    //设置线条的风格
    pen.setStyle(Qt::DashLine);
    //让painter对象应用pen对象
    painter.setPen(pen);

第五步:设置画刷的属性(填充)

画刷的style取值可以如下,也就是填充效果

//设置画刷属性
QBrush brush;
brush.setColor(QColor(0,0,255));
brush.setStyle(Qt::Dense5Pattern);
painter.setBrush(brush);

painter.drawEllipse(200,200,400,100);

如果要实现不同的填充效果,可以继续更改brush的style即可 

 效果如下:

第六步:开始绘制

绘制线段

void drawLine(const QPoint &p1, const QPoint &p2);
参数:
        p1:绘制起点坐标
        p2:绘制终点坐标

示例:

    //创建QPainter对象
    QPainter painter(this);
    //设置QPainter绘制的字体属性
    QFont font("微软雅黑",24);
    painter.setFont(font);

    //设置画笔属性
    QPen pen;
    //设置成蓝色的线条
    pen.setColor(QColor(0,0,255));
    //设置线条的粗细
    pen.setWidth(5);
    //设置线条的风格
    pen.setStyle(Qt::SolidLine);
    //让painter对象应用pen对象
    painter.setPen(pen);

    //开始绘制
    painter.drawLine(100,100,200,100);

效果:

绘制矩形

void QPainter::drawRect(int x , int y , int width , int height )
参数:
        x:窗⼝横坐标;
        y:窗⼝纵坐标;
        width:所绘制矩形的宽度;
        height:所绘制矩形的⾼度;

示例:

    painter.drawRect(100,100,200,200);

效果:

绘制圆形 

void QPainter::drawEllipse(const QPoint & center , int rx , int ry )
参数:
        center:中心点坐标
        rx:横坐标
        ry:纵坐标

示例:

前两个参数指定圆心,后面两个参数指定外接矩形的宽度和高度 

    painter.drawEllipse(200,200,100,100);

 效果

如果我们宽度或者高度不一样的话,他会产生一个椭圆的效果。 

绘制文本

QPainter类 中不仅提供了绘制图形的功能,还可以使⽤ QPainter::drawText() 函数来绘制⽂字,也可以使⽤QPainter::setFont() 设置字体等信息。
这里的前两个参数,0横坐标表示的是文字最左侧的位置,100纵坐标表示的是文字的基线位置,所谓基线就是四线个中的第三条,如下:

示例:

painter.drawText(0,100,"hello");

效果如下:

绘制图片

Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture,它们都是常⽤的绘图设备。
  • QImage主要⽤来进行 I/O 处理,它对 I/O 处理操作进⾏了优化,⽽且可以⽤来直接访问和操作像素;
  • QPixmap 主要⽤来在屏幕上显⽰图像,它对在屏幕上显⽰图像进⾏了优化;
  • QBitmap是 QPixmap 的子类,⽤来处理颜⾊深度为1的图像,即只能显示黑白两种颜⾊;
  • QPicture ⽤来记录并重演 QPainter 命令

基础绘制

前两个参数为从哪个坐标开始绘制图案

    QPixmap pixmap(":/background.jpg");
    painter.drawPixmap(100,100,pixmap);

缩放绘制

前两个参数还是与基础绘制一样,400和300 分别是缩放后图片的宽度和高度

    QPixmap pixmap(":/background.jpg");
    painter.drawPixmap(100,100,400,300,pixmap);

图片旋转

图片旋转,本质上是把QPainter对象进行了旋转,绘制出来的内容也就产生了旋转。

旋转180度

painter.rotate(180);

这个旋转是绕着(0,0)坐标系原点进行的旋转,因此如果我们直接旋转的话,图像可能超出窗口,无法看到效果,所以我们还要进行平移 。

图片平移

这里我们平移是把坐标系原点(painter的起点)平移一下,这里是负的是因为我们之前将整个坐标系旋转了180度所以这里要平移到窗口内,需要取负值

painter.translate(-800,-600);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【复旦微FM33 MCU 外设开发指南】总集篇

各位好,这里是冷凝雨。 本系列旨在为复旦微的MCU提供全面的开发指南 以FM33LC0xx(Arm M0)为例,与现有的其余MCU型号,如FM33LG0xx、FM33M0xx等有许多相同之处。 本系列将侧重寄存器开发,分享一些各外设使用的…

线上静态的前端、nginx环境基础、基于域名的虚拟主机、基于ip的访问、部署nfs

一、环境基础: 1.查看文件(不要注释及空行) [root17dns ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf 2.备份源文件: [root17dns ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.con…

希尔排序, 插入排序, 冒泡排序, 选择排序【C++】

希尔排序&#xff0c; 插入排序&#xff0c; 冒泡排序&#xff0c; 选择排序 测试代码希尔排序选择排序冒泡排序插入排序 测试代码 #include <iostream> using namespace std;int main() {int arr[6] { 0 };int len sizeof(arr) / sizeof(int);for (int i 0; i < …

混合精度、异构计算——杂记

1、英伟达GPU架构 Figure 1 shows a full GA100 GPU with 128 SMs. The A100 is based on GA100 and has 108 SMs. SM是streaming multiprocessor的简写&#xff0c;4个处理单元组成一个SM&#xff0c;如Figure 2。 每个SM有64个INT32&#xff0c;64个FP32&#xff0c;32个F…

【Linux网络】网络层协议:IP

本篇博客整理了 TCP/IP 分层模型中网络层的 IP 协议&#xff0c;旨在让读者更加深入理解网络协议栈的设计和网络编程。 目录 一、网络层 二、IP 报头 1&#xff09;报头与有效载荷的分离 2&#xff09;有效载荷的上交 3&#xff09;源 IP 与目的 IP 4&#xff09;生存时间…

大模型学习笔记 - 大纲

LLM 大纲 LLM 大纲 1. LLM 模型架构 LLM 技术细节 - 注意力机制LLM 技术细节 - 位置编码 2. LLM 预训练3. LLM 指令微调 LLM 高效微调技术 4. LLM 人类对齐 LLM InstructGPTLLM PPO算法LLM DPO 算法 5. LLM 解码与部署6. LLM 模型LLaMA 系列7. LLM RAG 1. LLM 模型架构 大模…

奥特曼格斗进化0-3汉化版丨奈克瑟斯手机版,PC+安卓合集

今天小孩吵着要玩奈克瑟斯手机游戏&#xff0c;都是平时看那些游戏主播打这些游戏。 看着家里几千张奥特曼卡&#xff0c;脑壳就疼&#xff0c;索性还是闲鱼买了&#xff0c;因为我也没找到很全的。挨个找了个遍就不浪费时间了 百度网盘哈&#xff0c;也懒得转迅雷&#xff0c…

PXE——安装,配置,测试(rhel7环境下)

什么是PXE PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;允许计算机在开机时从网络而非本地硬盘或其他存储设备启动。这种技术主要用于网络启动和自动化安装系统&#xff0c;尤其在需要为大量计算机同时安装操作系统的情况下非常有用。…

jupyter notebook安装

1.安装 pip install notebook 2.显示配置文件&#xff1a; jupyter notebook --generate-config 3.修改代码路径&#xff1a; 编辑配置文件C:\Users\a\.jupyterjupyter_notebook_config.py 4.运行 jupyter notebook 会自动弹出http://localhost:8888/tree

Elastic:IK分词器分词、停用词热更新如何配置-基于数据库

上一期&#xff0c;我们说明了基于API形式的热更新&#xff0c;但是API形式的热更新存在词库的管理不方便&#xff0c;要直接操作磁盘文件&#xff0c;检索页很麻烦&#xff1b;文件的读写没有专门的优化&#xff0c;性能不好&#xff1b;多一次接口调用和网络传输等缺点&#…

软件测试需要具备的基础知识【功能测试】---前端知识(一)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 为了更好的学习软件测试的相关技能&#xff0c;需要具备一定的基础知识。需要学习的基础知识包括&#xff1a; 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写&#xff0c;这是第二篇 …

MongoDB未授权访问漏洞

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作&#xff08;增、删、改、查高危动作&#xff09;而且可以远程访问数据库。 漏洞原因 造成未授权访问的根本原因就在于启动 Mongodb 的时候未设置 --auth 也很少…

Node.js的下一代浏览器和移动自动化测试框架-WebdriverIO

在现代软件开发中&#xff0c;自动化测试已成为保障软件质量的关键环节。而在众多测试框架中&#xff0c;WebdriverIO凭借其强大的功能和简洁的语法&#xff0c;成为Node.js生态中备受瞩目的浏览器和移动自动化测试框架。那么&#xff0c;WebdriverIO究竟有哪些独特之处&#x…

Substance Painter材质制作原理

21 材质制作原理_哔哩哔哩_bilibili 颜色&#xff0c;纹理&#xff0c;高光 木头的制作 玻璃的制作 玻璃要给一定的金属度

指标一致化处理

什么是数据指标 数据指标有别于传统意义上的统计指标&#xff0c;它是通过对数据进行分析得到的一个汇总结果&#xff0c;是将业务单元精分和量化后的度量值&#xff0c;使得业务目标可描述、可度量、可拆解。 数据指标有哪些类型 极大型:期望取值越大越好&#xff1b; 极小…

战略项目与可以帮助战略的项目

在公司内&#xff0c;如果没有机会做战略项目&#xff0c;那么就尽可能让自己的项目产生一些可以被战略项目使用的成果&#xff0c;最好是可以被多个战略项目使用的成果。 或者&#xff0c;将自己的项目和战略项目融合。 比如&#xff0c;一家生产面包的企业&#xff0c;你是负…

用PyTorch 从零开始构建 BitNet 1.58bit

我们手动实现BitNet的编写&#xff0c;并进行的一系列小实验证实&#xff0c;看看1.58bit 模型是否与全精度的大型语言模型相媲美&#xff01; 什么是量化以及为什么需要它&#xff1f; 量化是用更少的比特数表示浮点数的过程。当两个数字使用不同的比特数进行量化时&#xf…

一篇教会你PXE高效批量网络装机及kickstart无人值守安装

目录 搭建PXE的前提 搭建PEX的过程 如何构建PXE服务器 搭建本地yum源 搭建apache 创建软链接将本地yum源到apache页面下 搭建dhcp服务 dhcp配置文件如下 使用system-config-kickstart生成ks.cfg文件 &#xff0c;.cfg配置文件如下 搭建TFTP服务 搭建完成后测试 搭建…

跟李沐学AI:NiN网络中的网络

NiN块 一个卷积层后跟着两个全连接层&#xff08;实际为核窗口大小为1x1的卷积层&#xff09;。卷积层步幅为1&#xff0c;无填充&#xff0c;输出形状与卷积层输出形状相同&#xff0c;起到全连接层的作用。 NiN架构 无全连接层&#xff0c;交替使用NiN块和步幅为2的最大池化…

【C++标准模版库】list的介绍及使用

list 一.list的介绍二.list的使用1.list 构造函数2.list 空间大小3.list 增删查改4.list 迭代器的使用1.正向迭代器2.反向迭代器 5.list 其他成员函数 三.vector与list关于sort性能的比较 一.list的介绍 C中的list标准模板库&#xff08;STL&#xff09;是C标准库中的一个重要组…