【QT学习十五】 QT基本绘图

目录

1. Qt绘图基础

1.1 什么是Qt绘图

1.2 基本绘图类与函数

2. 简单图形绘制

2.1 画线、矩形和椭圆

2.2 绘制文本和图像

3. 高级绘图技巧

3.1 使用QPainterPath绘制复杂图形

3.2 渐变填充与图案填充

4. 绘图性能优化

4.1 双缓冲技术

4.2 使用QPixmap和QImage提高性能

5. 实战案例:绘制自定义控件

5.1 需求分析与设计

5.2 实现与优化

6. 总结与展望


1. Qt绘图基础

1.1 什么是Qt绘图

        Qt绘图模块提供了一系列功能强大的类和方法,允许开发者在窗口部件上绘制各种图形元素。通过理解Qt绘图的基本概念和组件,开发者可以灵活地创建各种自定义图形界面。

1.2 基本绘图类与函数

QPainter:核心绘图类,提供了绘制点、线、矩形、椭圆等基本图形的方法。
QPen:用于定义线条的颜色、宽度和样式。
QBrush:用于定义填充图形的颜色和模式。

void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setPen(Qt::black);painter.drawLine(10, 10, 100, 100);
}

2. 简单图形绘制

2.1 画线、矩形和椭圆

绘制基本图形是Qt绘图的起点。通过设置QPen和QBrush,可以定义图形的边框和填充样式。

void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setPen(QPen(Qt::blue, 2, Qt::SolidLine));painter.drawRect(10, 10, 100, 50);painter.setBrush(QBrush(Qt::green, Qt::DiagCrossPattern));painter.drawEllipse(120, 10, 100, 50);
}

2.2 绘制文本和图像

Qt提供了简便的方法在窗口部件上绘制文本和图像。

void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.drawText(10, 80, "Hello, Qt!");QImage image(":/images/sample.png");painter.drawImage(10, 100, image);
}

3. 高级绘图技巧

3.1 使用QPainterPath绘制复杂图形

QPainterPath类允许创建和复用复杂的路径,可以包含线条、曲线和其他形状。

void paintEvent(QPaintEvent *event) {QPainter painter(this);QPainterPath path;path.moveTo(10, 10);path.lineTo(100, 100);path.arcTo(50, 50, 100, 100, 0, 180);painter.drawPath(path);
}

3.2 渐变填充与图案填充

使用QGradient类可以创建渐变效果,使图形更加生动。

void paintEvent(QPaintEvent *event) {QPainter painter(this);QLinearGradient gradient(0, 0, 100, 100);gradient.setColorAt(0, Qt::white);gradient.setColorAt(1, Qt::black);painter.setBrush(gradient);painter.drawRect(10, 10, 100, 100);
}

4. 绘图性能优化

4.1 双缓冲技术

双缓冲可以有效减少绘图时的闪烁现象,提高用户体验。

void paintEvent(QPaintEvent *event) {QPixmap pixmap(size());QPainter painter(&pixmap);// Perform all drawing on the pixmappainter.setPen(Qt::red);painter.drawLine(0, 0, width(), height());// Copy the pixmap to the widgetQPainter widgetPainter(this);widgetPainter.drawPixmap(0, 0, pixmap);
}

4.2 使用QPixmap和QImage提高性能

在需要频繁重绘的场景下,使用QPixmap或QImage存储图像数据可以显著提升性能。

5. 实战案例:绘制自定义控件

5.1 需求分析与设计

        设计一个自定义控件需要考虑其功能需求和用户交互方式。本文以一个简单的音量调节控件为例进行讲解。

5.2 实现与优化

通过继承QWidget并重写paintEvent方法,实现自定义控件的绘制。

class VolumeControl : public QWidget {void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.setPen(Qt::black);painter.drawRect(10, 10, 100, 20);painter.setBrush(Qt::blue);painter.drawRect(10, 10, volume, 20);}int volume = 50; // 初始音量
};

6. 总结与展望

        绘图是Qt开发中的重要一环,灵活运用这些技巧可以大大提升应用程序的界面表现力和用户体验。在实际开发中,还需要不断尝试和优化,以应对不同的需求和挑战。Qt绘图功能强大且灵活,适合各种应用场景。从简单图形到复杂自定义控件,只要掌握了基本原理并不断实践,一定能在Qt开发中游刃有余。

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

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

相关文章

object-C 解答算法:合并两个有序数组(leetCode-88)

合并两个有序数组(leetCode-88) 题目如下图:(也可以到leetCode上看完整题目,题号88) 首先搞懂,什么叫“非递减顺序” 非递减顺序,是指一个序列中的元素从前往后(或从左到右)保持不减少或相等。 这意味着序列中的元素可以保持相同的值,但不会…

实战:SpringBoot扩展功能ExitCodeGenerator生成的退出代码

1. 简介 ExitCodeGenerator是 Spring Boot 框架中的一个接口,它允许应用程序退出时生成自定义的退出代码。你可以根据不同的退出码,执行相应的动作,如:资源清理,日志记录等。 我们可以通过实现ExitCodeGenerator接口…

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

全网最适合入门的面向对象编程教程:17 类和对象的 Python 实现-鸭子类型与“file-like object“ 摘要: 本文主要介绍了 Python 中创建自定义类时鸭子类型的基本定义、特点和应用场景,同时列举了**“file-like object“** 的例子对鸭子类型进…

axios以post方式提交表单形式数据

某些后端框架请求接口必须走form表单提交的那种形式&#xff0c;但前端很少有<form action"接口地址" method"post"></form>这种写法去提交表单数据&#xff0c;所以前端需要用axios模拟一个表单提交接口。 Content-Type 代表发送端&#xff0…

单链表的介绍和实现

前言 Hello,小伙伴们&#xff0c;你们的作者君又回来了&#xff0c;今天我将带领大家继续学习另一种线性表&#xff1a;单链表&#xff0c; 准备好的小伙伴三连打卡上车&#xff0c;你们的支持就是我更新的动力&#xff0c;一定不要吝啬手中的三连哟&#xff0c;万分感谢&…

ElementUI el-select 组件动态设置disabled后,高度变更的问题解决办法

问题描述 Vue2 项目在使用 el-select 组件时&#xff0c;动态将disabled变更为了 true&#xff0c;元素的高度发生了变化。 问题原因 通过浏览器开发人员工具面板&#xff0c;发现&#xff0c;组件内的 input 元素被动态设置了height的样式&#xff1a; 在项目中检查后并…

深度解析:如何优雅地删除GitHub仓库中的特定commit历史

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

three.js创建基础模型

场景是一个三维空间&#xff0c;是所有物品的容器。可以将其想象成一个空房间&#xff0c;里面可以放置要呈现的物体、相机、光源等。 通过new THREE.Scene()来创建一个新的场景。 /**1. 创建场景 -- 放置物体对象的环境*/ const scene new THREE.Scene();场景只是一个三维的…

Lianwei 安全周报|2024.07.15

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 《人工智能全球治理上海宣言》发布 我们强调共同促…

django学习入门系列之第四点《案例 后台管理样例》

文章目录 往期回顾 前期准备&#xff1a; 导航新建&#xff0c;按钮表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- 开发版本 --><link rel"stylesheet…

【php开发系统遇到CPU飙升的思考记录】

PHP开发系统遇到CPU负载飙升到瓶颈时&#xff0c;这里有一些步骤和策略可以快速定位并解决问题&#xff1a; 1. **使用监控工具**: 利用top命令来查看系统的整体CPU使用情况&#xff0c;特别是查看load average&#xff08;平均负载&#xff09;&#xff0c;这可以快速判断系统…

2024-07-16 Unity插件 Odin Inspector6 —— Group Attributes

文章目录 1 说明2 Group 特性2.1 BoxGroup2.2 ButtonGroup2.3 FoldoutGroup2.4 ShowIfGroup / HideIfGroup2.5 HorizontalGroup2.6 ResponsiveButtonGroup2.7 TabGroup2.8 ToggleGroup2.9 VerticalGroup 1 说明 ​ 本文介绍 Odin Inspector 插件中有关 Group 特性的使用方法。…

【解决问题】permission denied while trying to connect to the Docker daemon socket

解决方法 sudo usermod -aG docker $USER 运行上面命令&#xff0c;将当前用户添加到 docker 组&#xff0c;重启电脑。 GPT-4o (OpenAI) 看起来你在尝试通过 make build 构建项目时遇到了权限问题&#xff0c;尤其是在拉取 Docker 镜像时没有权限访问 Docker 的 Unix 套接…

如何使用 GPT?

​通过实例&#xff0c;来展示如何最好地使用 GPT。 生成文字 假设你在写一篇文章&#xff0c;需要在结尾加上这样一句&#xff1a;「California’s population is 53 times that of Alaska.」&#xff08;加州的人口是阿拉斯加州的 53 倍&#xff09;。 但现在你不知道这两个…

谷歌准备斥资 230 亿收购网络安全初创公司 Wiz

Alphabet 正在就收购 Wiz 进行深入谈判&#xff0c;这将显著增强其安全能力。这将是谷歌母公司有史以来最大规模的收购。 这是路透社根据匿名消息来源撰写的内容。目标收购金额为230亿美元&#xff0c;即211亿欧元。 Wiz 拥有实时检测和响应网络威胁的技术。通过实施人工智能…

有关电力电子技术的一些相关仿真和分析:⑥单相相控调压电路与单相斩控调压电路(MATLAB/Siumlink仿真)

针对单相相控调压电路&#xff0c;仿真研究对于给定负载&#xff0c;不同触发角作用下&#xff0c;输出电压波形和输入电流波形&#xff08;对照电网电压&#xff09;&#xff0c;研究输出电压有效值随触发角变化的规律&#xff0c;讨论并验证输入电流连续的条件。采用相同的电…

WPF实现一个带旋转动画的菜单栏

WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目&#xff0c;如下所示 2、创建文件夹及文件 创建资源文件夹&…

<Qt> 初识Qt

目录 一、项目文件解析 widget.h main.cpp widget.cpp widget.ui .pro文件 二、QT 实现Hello World程序 &#xff08;一&#xff09;按钮控件 1. 纯代码 2. 图形化 &#xff08;二&#xff09;标签控件 1. 纯代码 2. 图形化 三、内存泄漏问题 四、qdebug()的使用…

php基础: 三角形

包含&#xff1a;左三角、左上三角、右三角、右上三角、等腰三角、倒等腰三角。注意空格的数量&#xff0c;因为*号后面加了空格 /*** * 左三角形* param $n* return void*/ function triangleLeft($n){echo <pre>;for ($i 1; $i < $n; $i) {for ($j 1; $j < $i…

el-table的selection多选表格改为单选

需求场景: 选择表格数据时&#xff0c;需要控制单条数据的操作按钮是否禁用。 效果图: html代码: <div><el-tableref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"selection-change"handl…