当前位置: 首页 > news >正文

Qt入门9——绘图

基本概念

虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景. 很多时候我们需要更强的"DIY"能力;
Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计。

绘图api核心类:

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

(绘图API的使用,⼀般不会在QWidget的构造函数中使用,而是要放到paintEvent中)

示例1:分别画出线段、矩形、圆形

1.在widget.h中声明绘图事件
在这里插入图片描述2.在widget.cpp中重写paintEvent()函数

void Widget::paintEvent(QPaintEvent *event)
{(void) event;//实例化画家对象(需包含QPainter头文件)QPainter painter(this);//画一条线段painter.drawLine(200,50,400,50);//(x1,y1,x2,y2)painter.drawLine(QPoint(200,100),QPoint(400,100));//((x1,y1)(x2,y2))//画一个矩形painter.drawRect(200,150,200,100);//(x1,y1,width,height)//画一个圆形painter.drawEllipse(200,300,200,200);//(圆外切矩形的相关参数)
}

效果如图:
在这里插入图片描述

示例2:绘制文本

QPainter类中不仅提供了绘制图形的功能,还可以使用QPainter::drawText()函数来绘制文字,也可以使用QPainter::setFont() 设置字体等信息。
在示例1代码的基础上添加代码:

void Widget::paintEvent(QPaintEvent *event)
{(void) event;//实例化画家对象(需包含QPainter头文件)QPainter painter(this);QFont font("微软雅黑",24);painter.setFont(font);//添加文本painter.drawText(20,200,"求个关注♥");
}

效果如图:
在这里插入图片描述

示例3:设置画笔

QPainter 在绘制时,是有⼀个默认的画笔的。在使用时也可以自定义画笔。在Qt中,QPen类中定义了QPainter应该如何绘制形状、线条和轮廓。同时通过QPen类可以设置画笔的线宽、颜色、样式、画刷等;
画笔的颜色可以在实例化画笔对象时进行设置,画笔的宽度是通过setWidth()方法进行设置,画笔的
风格是通过setStyle()方法进行设置,设置画刷主要是通过setBrush()方法;
设置画笔颜色:QPen::QPen(constQColor&color) 画笔的颜色主要是通过QColor类设置;
设置画笔宽度:voidQPen::setWidth(intwidth)
设置画笔风格:voidQPen::setStyle(Qt::PenStylestyle)

查阅Qt文档,查看画笔的风格有以下几种:
在这里插入图片描述
仍在示例1的基础上添加代码:

void Widget::paintEvent(QPaintEvent *event)
{(void) event;//实例化画家对象(需包含QPainter头文件)QPainter painter(this);//添加画笔QPen pen;//设置画笔线条颜色 为红色线条pen.setColor(QColor(255,0,0));//设置画笔线条粗细pen.setWidth(5);//设置画笔线条风格pen.setStyle(Qt::DashLine);//让画家拿起画笔painter.setPen(pen);//画一个圆形painter.drawEllipse(300,200,200,200);//(圆外切矩形的相关参数)
}

效果如图:
在这里插入图片描述

示例4:设置画刷

在Qt中,画刷是使用QBrush类来描述,画刷大多用于填充。QBrush定义了QPainter的填充模式,具有样式、颜色、渐变以及纹理等属性;
画刷的格式中定义了填充的样式,使用Qt::BrushStyle枚举,默认值是Qt::NoBrush,也就是不进行任何填充。可以通过Qt助手查找画刷的格式。
如下图所示:

在这里插入图片描述
设置画刷主要通过voidQPen::setBrush(constQBrush&brush)方法,其参数为画刷的格式。
在示例3代码的基础上添加代码:

void Widget::paintEvent(QPaintEvent *event)
{(void) event;//实例化画家对象(需包含QPainter头文件)QPainter painter(this);//添加画笔QPen pen;//设置画笔线条颜色 为红色线条pen.setColor(QColor(255,0,0));//设置画笔线条粗细pen.setWidth(5);//设置画笔线条风格pen.setStyle(Qt::DashLine);//让画家拿起画笔painter.setPen(pen);//添加画刷QBrush brush;//设置画刷颜色brush.setColor(QColor(0,255,0));//设置画刷风格brush.setStyle(Qt::CrossPattern);//让画家拿起画刷painter.setBrush(brush);//画一个圆形painter.drawEllipse(300,200,200,200);//(圆外切矩形的相关参数)
}

效果如图:
在这里插入图片描述

示例5:绘制图片

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

1.首先按照添加qrc文件的方法添加图片
2.按照示例1的步骤在widget.h中添加绘图事件声明
3.在widget.cpp中重写paintEvent()函数

void Widget::paintEvent(QPaintEvent *event)
{(void) event;QPainter painter(this);QPixmap pixmap(":/1.jpg");//基础绘制//painter.drawPixmap(0,0,pixmap);//图片缩放//painter.drawPixmap(0,0,400,400,pixmap);//图片旋转,本质上是把QPainter对象进行了旋转,绘制出来的内容也就发生了旋转painter.rotate(180);//顺时针旋转180度//旋转180度,此时是以原点为中心旋转的//如果要改变旋转的中心,可以使用translate()函数完成painter.translate(-800,-600);//将原点平移到右下角painter.drawPixmap(0,0,400,400,pixmap);
}

效果如图:
在这里插入图片描述

相关文章:

Qt入门9——绘图

基本概念 虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景. 很多时候我们需要更强的"DIY"能力; Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计。 绘图api核心类: 类说明QPaint…...

FreeRTOS之ARM CR5栈结构操作示意图

FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…...

Java线程的interrupt中断、wait-notify/all(源码级分析)

实例方法: interrupt()方法是设置结束阻塞(sleep、),并且设置中断标记true isInterrupted()判断当前是否中断 静态方法: Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好,既然上面的方法作用是清晰的&…...

计网408考点讲解

IPv4...

当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库

解决方法: ldd 命令来验证程序是否加载了正确的库: 如检查linear_elasticity可执行文件缺少的库,用下面命令: ldd linear_elasticity 可以发现下面not found就是缺少的库,还有对应的库的位置已经版本 $ ldd lin…...

文件下载的几种方式

1、使用window.open方法 url: 可以为文件存放的地址 function downloadFile(url) {window.open(url); }2、使用<a>标签进行文件下载 <a href"/多因素登录说明文档.pdf" class"link-text">说明文档</a> 3、使用fetch和Blob对象 这种…...

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...

访问http网页强制跳转到了https的解决办法

目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因&#xff1a;HSTS&#xff08;HTTP Strict Transport Security&#xff09;什么是 HSTS&#xff1f;HSTS 的工作原理 如何解决&#xff1f;1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息&#xff1a;在 Firef…...

3D 生成重建016-SA3D从nerf中分割一切

3D 生成重建016-SA3D从nerf中分割一切 文章目录 0 论文工作1 方法介绍2 实验结果 0 论文工作 1 SAM的背景和目标&#xff1a; SAM 是一种强大的二维视觉基础模型&#xff0c;能够在 2D 图像中进行任意物体的分割。传统上&#xff0c;SAM 在二维空间表现出色&#xff0c;但其无…...

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程&#xff1a; 用户在浏览器输入域名URL&#xff0c;例如www.baidu.com。 不过&#xff0c;浏览器并不知道为该域名提供服务的服务器具…...

qt基本部分控件用法(一)

前言: 以前 windows下做工具主要是MFC&#xff0c;趁有点空时间&#xff0c;研究了QT&#xff0c;感觉跟MFC 差不多&#xff0c;VS 比 QT CREATOR 还是强大&#xff0c;不过QT可以跨平台&#xff0c;功能更强大&#xff0c;MFC 只能在win平台下.&#xff1b; 1&#xff1a;环境…...

【Linux】环境ChatGLM-4-9B 模型之 openai API 服务

一、摘要 最近看到 Function Call 比较感兴趣,它的核心是赋予大模型能够调用外部API的能力,能够解决大模型功能扩展性问题,允许模型调用外部数据库或API,提供特定领域的详细信息;解决信息实时性问题,模型可以实时获取最新数据;解决数据局限性问题,大模型训练数据虽多但…...

Too many open files 问题处理

某个简单的 python 服务&#xff0c;运行一段时间就崩溃。查看日志后发现有一个系统错误 OSError: Errno24 Too many open files要理解这个问题&#xff0c;首先要理解什么是文件描述符&#xff0c;可以参考我的另一篇文章(Linux 系统文件描述符&#xff08;File Descriptor&a…...

CentOS 7 环境下常见的操作和配置

目录 1. CentOS 7 中的 vsftpd 配置与使用 安装与启动 vsftpd 配置 vsftpd&#xff08;/etc/vsftpd/vsftpd.conf&#xff09; 常见命令 2. 使用 yum 包管理器 3. 安全性与防火墙配置 开放端口 4. 使用 systemd 管理服务 5. SELinux 配置 查看 SELinux 状态 临时禁用…...

HTTP(超文本传输协议)

HTTP是万维网通信的基础构成&#xff0c;是一个简单的请求相应协议&#xff0c;基于TCP之上80号端口 通信原理 DNS解析 将域名甩个DNS服务器解析&#xff0c;将域名化为IP访问 建立TCP连接 如图&#xff0c;客户端先发送一个sys置位seq为x&#xff08;任意值&#xff09;的…...

etcd-v3.5release-(3)-readIndexRead

笔记1&#xff1a;读操作包括两种&#xff0c;readIndex和serilizable&#xff0c;readIndex指一致性读&#xff0c;一旦a读到了数据x&#xff0c;那么a及a以后的数据都能读到x&#xff0c;readIndex读会先确认本leader是不是有效地leader&#xff0c;如果有效则记录此刻的comm…...

IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置

NA消息用单播还是多播的判断理由 单播回复&#xff08;Unicast&#xff09;&#xff1a; 如果客户端发送 RS 消息时&#xff0c;使用的是一个全局地址或链路本地地址作为源地址&#xff0c;则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量&#xff0c;…...

C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数

知识要点&#xff1a;数组作函数参数 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序&#xff0c;前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...

PostgreSQL数据库连接:psqlODBC驱动安装与配置实战指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文将提供详细的psqlODBC驱动程序在Windows操作系统上的安装和配置指南&#xff0c;使用户能够通过ODBC标准连接到PostgreSQL数据库。安装步骤涵盖获取安装文件、运行安装向导、选择安装路径、完成安装以及配置…...

【NLP 8、normalization归一化函数:sigmoid、softmax】

目录 Normalization&#xff08;归一化&#xff09; 1.特点 目的 应用场景 输出范围 2. Sigmoid 函数 目的 应用场景 输出范围 3. Softmax 函数 目的 应用场景 输出范围 "燃尽最后的本能&#xff0c;意志力会带你杀出重围" —— 24.12.2 Normalization&#…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

虚幻基础:角色旋转

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 移动组件使用控制器所需旋转&#xff1a;组件 使用 控制器旋转将旋转朝向运动&#xff1a;组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转&#xff1a;必须移动才能旋转&#xff0c;不移动不旋转控制器…...