Qt6教程之三(6) 界面自绘与绘图类

据博主所知,Qt的绘图技术目前分为三大阵营,分别是:

一,基于QWidget的界面自绘制,这种方式纯粹为纯代码绘制,随着绘制图形量的不断增加,会导致其难以管理和性能不佳;

二,基于Qt Graphics View框架的界面自绘,该框架功能强大,据官方给出的数据,绘制百万级图形不在话下,而且其管理方便,性能优越,在日常开发中,当自绘图形量足够多时,建议使用这种方式,而且其跨平台特性也能得到保证,属于Qt原生;

三,使用Qt Quick技术绘制界面,这是最近几年Qt新推出的技术,Qt Quick采用QML书写绘制逻辑,底层采用GPU硬件加速,其开发效率、运行效率、绘图性能均比前面两种强悍,属于顶端绘图技术架构,同时这也是Qt未来开发的主风向标!

以上纯属个人认知,若有笔误,请各位见谅,同时请在评论区留言,便于博主及时修正!

那接下来针对这前2种方式进行逐一演示,至于第三种也会进行简单演示,后面会专门开一章关于Qt Quick的博文,敬请期待!

话不多说,开始写代码:

一 基于QWidget的界面自绘制

首先新建一个工程,取名叫 SefWidget ,不需要ui界面文件,继承QWidget,

简单画了几个常用的规则图形,其中的长方形实现了自定义鼠标点击事件,代码如下:

,widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QMouseEvent>
#include <QTimer>
#include <QWidget>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();// QWidget interface
protected:void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *event);void keyPressEvent(QKeyEvent *event);signals:void mouseIndexChange(int x,int y);
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"#include <QBrush>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QPainter>
#include <QPainterPath>
#include <QPointF>
#include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent)
{resize(1200,1200);setWindowTitle("painter ") ;}Widget::~Widget()
{
}//控件的绘画事件
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setPen(QPen(QColor(255,0,0)));painter.setBrush(QBrush(QColor(255,0,0)));painter.setFont(QFont("Microsoft YaHei",55));painter.drawText(this->rect(),"test text");painter.drawEllipse(0,150,90,90);painter.drawChord(150,150,260,260,30*16,120*16);painter.drawLine(0,300,600,300);QPainter painter2(this);painter2.setPen(QPen(QColor(255,0,0)));painter2.setBrush(QBrush(QColor(255,250,0)));QPainterPath path;path.addRoundedRect(QRect(20,350,200,100),1,1,Qt::AbsoluteSize);path.addRoundedRect(QRect(20,460,200,100),25,25,Qt::RelativeSize);painter2.drawPath(path);//根据四个定点绘制一个多边形const QPointF points[4] = {QPointF(10.0, 610.0),QPointF(20.0, 590.0),QPointF(80.0, 700.0),QPointF(90.0, 800.0),};painter.drawPolygon(points, 4);}void Widget::mousePressEvent(QMouseEvent *event)
{qDebug()<<event->position().x()<<","<<event->position().y();int x= event->position().x();int y= event->position().y();if(event->button()==Qt::LeftButton ){if((22<x && x <220)  && (350<y && y<450)){QMessageBox::information(this,"self button","hello world!");}}qDebug()<<event->button();
}void Widget::keyPressEvent(QKeyEvent *event)
{}

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

运行效果:

二 基于Qt Graphics View框架的界面自绘

Qt Graphics View能够实现图形的选择、拖放、修改、标注等功能,非常强大,其原理为:

在场景里面绘制物体,视图按照实际需要继续显示! 其架构有以下三个类分工负责完成:
1,QGraphicsScene类提供绘图场景 ;
2,QGraphicsView提供绘图的视图组件;
3,QGraphicsItem类是图形项的基类;

具体使用请参见以下博文,在此就不在赘述啦!

之前博主也有一篇博文有提到,链接:

Qt6教程之二(8) Display Widgets_爱折腾的业余程序员的博客-CSDN博客本篇文章主要介绍Qt的显示控件基础使用!https://blog.csdn.net/XiaoWang_csdn/article/details/129222330

这里推荐一篇比较优秀的博客,链接:QT Graphics View_qtgraphicsview_Mr.codeee的博客-CSDN博客1.概述采用QPainter绘图时需要在绘图设备paintEvent()事件里编写绘图的程序,实现整个绘图过程,这种方法如同使用windows的画图软件在绘图,绘制的是位图,这种方法适合于绘制复杂性不高的固定图形,不能实现图件的选择、编辑、拖放、修改等功能。Graphics View是一种基于图形项的模型/视图模式,并且每个图形元件是可选择、可拖放和修改的,由3个部分组成,场景、视图、图形项视图、场景、图形项的关系2.场景QGraphicsScene类提供绘图场景,场景是不可见的,是一https://blog.csdn.net/wzz953200463/article/details/115190508?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167799996516800197084448%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167799996516800197084448&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-115190508-null-null.142%5Ev73%5Epc_search_v2,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&utm_term=qt%20graphics%20view%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187

另外,官方示例里面也有关于Graphics View的示例教程,免费下载,链接如下:

Qt 官方 Graphics view示例工程文件icon-default.png?t=N176https://download.csdn.net/download/XiaoWang_csdn/87459471运行效果:

 

三,使用Qt Quick技术绘制界面

Qt Quick是Qt界面的未来趋势,而且开发效率极高,运行性能直接支持GPU硬件加速,直接开发工业级画图软件也是不在话下,下面我们将新建一个Qt Quick工程文件,来体验Qt Quick的强大之处。

话不多说,开始写代码:

新建一个Qt Quick工程,工程名称叫MyQuick ,

 

 

 

一直下一步,最后点击完成,

 

接下来我们画一个矩形,然后在矩形里面放置一个文本字符串,显示 hello world !  ;
双击打开 main.qml ,添加内容如下:


import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle {width: 400height: 400color: "blue"border.color: "red"border.width: 5radius: 10Text {id: nametext: qsTr("hello world!")}}}

 

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;const QUrl url(u"qrc:/MyQuick/main.qml"_qs);QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app,[url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl) QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

 

运行效果:

是不是非常高效快捷,接下来我们实现鼠标事件,当点击矩形时把颜色换为红色,添加内容如下:
 

MouseArea{anchors.fill: parentonClicked: { parent.color = 'red'}}

完整代码:


import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle {width: 400height: 400color: "blue"border.color: "red"border.width: 5radius: 10Text {id: nametext: qsTr("hello world!")}MouseArea{anchors.fill: parentonClicked: { parent.color = 'red'}}}}

 

效果对比:

 

 

 这效率是不是比纯手工写代码高很多了呢,至于与C++的交互,留在后面的教程里详细示范!

上一篇文章链接:

Qt6教程之三(5) Model/View_爱折腾的业余程序员的博客-CSDN博客本篇博客主要介绍Qt中的model-view原理及实际应用!https://blog.csdn.net/XiaoWang_csdn/article/details/129338804

下一篇文章链接:

Qt6教程之三(7) Qt开发桌面软件常用技术_爱折腾的业余程序员的博客-CSDN博客大体介绍Qt开发桌面软件常用工具类及相关技术!https://blog.csdn.net/XiaoWang_csdn/article/details/129347751?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129347751%22%2C%22source%22%3A%22XiaoWang_csdn%22%7D

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

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

相关文章

HighCharts实现3D不同高度圆环图、3D饼图

最近做可视化比较多&#xff0c;就常用的图表类型做了一下总结。 因为做可视化的图表代码量非常大&#xff0c;所以会把echarts图表单独抽离出来&#xff0c;封装成一个组件&#xff0c;也可以复用&#xff0c;所以这里我直接把封装的组件直接放在这里&#xff0c;是可以直接拿…

直播合辑 | 微软ATP与您相约100场公益演讲

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; Public100已历经了近一年的春夏秋冬&#xff0c;截止目前我们一共举办33场公益直播&#xff0c;由微软及合作伙伴中从事 AI 相关工作的工程师、产品经理、市场总监、运营经理等各类专家和学者&#xff0c;分享自己在学…

微信春节大数据出炉:《三体》阅读量第一 ;曝iOS 17应用商店将向第三方开放;斯坦福大学推出DetectGPT|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

ChatGPT 串接 Firebase,實現上下文歷史紀錄

ChatGPT 串接 Firebase&#xff0c;實現上下文歷史紀錄 在使用 ChatGPT API 時&#xff0c;因為 API 本身是「一次性」&#xff0c;無法儲存聊天的歷史紀錄&#xff0c;這也衍生了「無法串聯上下文」的問題&#xff0c;不過如果將 ChatGPT 串連 Firebase 的 Realtime database…

ChatGPT:我围观了量子位MEET2023智能未来大会,还当了一回课代表

编辑部 ChatGPT 发自 凹非寺量子位 | 公众号 QbitAI 什么是“MEET2023智能未来大会”&#xff1f; 大会上来了哪些重磅嘉宾&#xff1f; 他们在大会上探讨了什么主题&#xff1f; 没错&#xff01;ChatGPT也参与了今年的大会&#xff0c;作为AI代表与人类嘉宾们一起回顾这一年来…

LM详解 GPT3,GPT2, GPT1 论文译读

LM详解 GPT3&#xff0c;GPT2, GPT1 论文译读 T5&#xff0c;Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer&#xff0c;2019 arxiv https://arxiv.org/abs/1910.10683 中译 https://zhuanlan.zhihu.com/p/89719631 讨论 如何评价 Goo…

chatgpt赋能python:Python提取扫描版PDF:一篇SEO文章

Python提取扫描版PDF&#xff1a;一篇SEO文章 Python在数据科学、自然语言处理、机器学习等领域中广泛应用。今天我们将关注Python的另一个应用&#xff1a;提取扫描版PDF。本文介绍了如何使用Python提取文本以及搜索引擎优化&#xff08;SEO&#xff09;的最佳实践。 提取扫…

Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。

ChatPDF的妙用 1、引言2、代码实战2.1 原理2.2 安装2.2 示例2.2.1 创建PDF文件2.2.2 旋转PDF文件2.2.3 拆分PDF文件2.2.4 合并PDF文件2.2.5 提取PDF文件内容 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近干啥了&#xff1f; 小鱼&#xff1a;最近&#xff1f; 你指…

chatgpt赋能python:Python实现多关键词搜索PDF文件

Python实现多关键词搜索PDF文件 概述 在今天的数字化社会中&#xff0c;很多信息都以数字化的形式存储在PDF文件中。这让我们在搜索特定信息时面临很多挑战&#xff0c;特别是当我们需要同时搜索多个PDF文件并集中检索这些文件时。 在这篇文章中&#xff0c;我们将介绍如何使…

零代码编程:用ChatGPT将PDF文件的表格批量转为Excel表格

电脑中有几百个PDF文件&#xff0c;文件内容格式一致&#xff0c;每个PDF文件第一页是一个表格。想把这几百个PDF文件里面的表格都提取出来&#xff0c;转为excel表&#xff0c;该怎么办&#xff1f; 打开ChatGPT&#xff08;一定要用GPT4&#xff0c;编程能力很强。相比之下&a…

chatgpt赋能python:Python抓取PDF内容:一个全面的指南

Python 抓取 PDF 内容&#xff1a;一个全面的指南 引言 Python 作为一种广泛使用的编程语言&#xff0c;已经拥有了许多应用功能。其中之一是抓取 PDF 文件的内容。 PDF 文件在今天的数字化世界中使用广泛&#xff0c;使得从 PDF 文件中提取内容变得尤其重要&#xff0c;对于…

ChatGPT-4模型读取PDF/网页链接实测结果!

联网和插件功能使用 直接在设置里面&#xff0c;把这两个开关开起来 联网功能&#xff1a; 3.5不会的东西是不会自动联网搜索的&#xff0c;Plus4.0可以进行联网搜索答案 插件功能&#xff1a; 首先在Settings里面把Plugins进行安装&#xff0c;选中要安装的插件&#xff0c;直…

a16z深度分析:AI 将创造哪些新的游戏玩法?

来源/a16z 编译/Nick 早期关于游戏中的生成式 AI 革命的讨论主要集中在 AI 工具如何提高游戏创作者的效率&#xff0c;使得游戏的制作速度比以前更快、规模更大。从长远来看&#xff0c;我们认为&#xff0c;AI 不仅能改变创造游戏的方式&#xff0c;还能改变游戏本身的性质。 …

ChatGPT对金融业将产生哪些影响?

黄浦区金融办 2023-05-22 02:30 发表于上海 近期人机互动模型ChatGPT进入应用领域&#xff0c;意味着人工智能的发展达到了新高地。那么&#xff0c;人工智能在金融领域的应用与未来发展趋势如何&#xff1f;会给金融机构带来哪些挑战&#xff1f;日前&#xff0c;《金融时报》…

OpManager 实时网络监控

网络是全球企业背后的基础。它在为您的员工提供行政服务以及为各大洲的客户提供服务方面发挥着关键作用。网络可帮助您将信息保存在一个集中位置 - 需要和限制所有其他入站请求的人员可以访问。那么&#xff0c;您如何提供持续的一流最终用户体验并维护快速发展的网络呢&#x…

使用 LangChain、Pinecone 和 LLM(如 GPT-4 和 ChatGPT)构建基于文档的问答系统

目录 一、简介 二、为什么语义搜索GPT问答比微调GPT更好&#xff1f; 2.1、更广泛的知识覆盖&#xff1a; 2.2、特定于上下文的答案&#xff1a; 2.3、适应性 2.4、更好地处理模糊查询 三、LangChain 模块 四、设置环境 五、加载文档 六、分割文档 七、使用 OpenAI 嵌入…

ChatGPT 启示录:AI 已经把人类逼退到了信仰和宗教的边界上了?

哲学的滑落 哲学之初&#xff0c;研究的对象是客观存在的物质实体&#xff0c;物体是不依赖于人们思想的东西。后来康德、叔本华等说物自体不可知&#xff0c;于是哲学家离开客体&#xff0c;转而研究人这一主体&#xff0c;研究人们内在感知到的表象世界。 到了维特根斯坦这里…

特斯拉因辅助驾驶发生致命车祸;APUS发布AiLMe大模型;欧洲成立人工智能研究中心来监督大型平台丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 APUS多模态大模型“AiLMe”发布 4月19日&#xff0c;APUS发布自研多模态人工智能大模型“AiLMe”。据介绍&#xff0c;AiLMe参数已达千亿规模&#xff0c;具备对文本、图像、视频、音频的理解和生成能力。针对具…

关于生成式人工智能服务管理的一些思考

&#xff08;本文阅读时间&#xff1a;&#xff16;分钟&#xff09; 01 生成式AI是我这几个月的重点研究领域&#xff0c;我也先后发表了20多篇文章&#xff0c;20来条视频节目&#xff0c;现在也在写作一本相关书籍&#xff0c;在业界也有那么一点点影响。 所以当生成式人工智…

马斯克低头了?改口此前评价比亚迪“做的不好”!

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 不得不说&#xff0c;互联网是带记忆的。 近日&#xff0c;有网友“挖”出一条 YouTube 上的“考古”视频 —— 特斯拉 CEO 马斯克评价比亚迪汽车“做的不好”。 令人没想到的是&#x…