为什么 qt 成为 c++ 界面编程的第一选择?

news2024/9/25 20:07:48

一、前言

为什么现在QT越来越成为界面编程的第一选择,笔者从事qt界面编程已经有接近8年,在这之前我做C++界面都是基于MFC,也做过5年左右。当时为什么会从MFC转到QT,主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MFC的界面库代码也是比较混乱,当时主要看到qt有qss样式设计这个功能,决定试下。当项目移植到到QT后,觉得MFC真的是可以抛弃了,MFC相对于QT缺点实在太多。当然MFC还有一个致命的缺陷,没法跨平台。

当然有同学可能说为什么不直接使用C# WPF做界面,我们一些项目和工具确实是用C#做的,C#和C++也确实可以互相调用,并且可以断点调试。但在性能上还是有不少的损失。对于我们做的音视频和三维仿真项目确实有影响,所以只在一些对性能没有极致要求的项目中使用C#。

二、QT历史

说了一些我们项目的情况,再来简单介绍一下QT历史,知道历史的目的是要判断使用此库是否有风险,是否会停止更新,很多开源库没有做好商业化最终都是停掉了。

l QT由奇趣科技公司开发

l 2008 诺基亚从奇趣科技公司收购Qt, 并增加LGPL的授权模式

l 2011 芬兰的Digia从Nokia收购了Qt的商业版权,从此Nokia负责Qt on Mobile, Qt Commercial由Digia负责

QT的开发的最高峰是在诺基亚智能手机如日中天的时候,那时候诺基亚塞班系统的手机应用大量都是基于QT,随着苹果和安卓的流行,塞班退出历史舞台。qt的手机端开发需求也基本被替代。但QT在嵌入式、电力系统、军工系统中应用一直没有被替代。

三、QT现在使用情况

了解一下他现在的情况,主要考虑应用场景是否多,就业是否广,人才是否好招聘。QT被广泛应用于嵌入式、电力系统、军工系统等要与硬件交互的界面系统中,并且大量的专业的跨平台应用软件也是使用QT开发。

digia接手QT后开发出了安卓和IOS版本的QT,实现了开发一套程序可以在全平台运行。但目前不建议使用QT开发安卓和IOS应用,坑还比较多但肯定会越来越完善。

四、QT提供的工具

再看下QT提供了哪些工具,QT不仅提供了功能丰富的SDK开发包,还提供了强大的工具,这也是我们选择他的原因之一。

1. 基于VS的插件qt-vs-addin

2. Qt助手(手册)

qt的手册还是比较完备,并且包含了很多示例的源码。

3. 基于XML的界面设计器Qt Designer

便捷的解码设计,应该是c++领域最方便的界面设计器。

4. 跨平台的开发工具 QtCreator

跨平台的c++开发工具,应该是在linux上最方便的c++开发调试工具,就算不用QT库,也可以用它来开发跨平台的c++项目。

五、QT框架优势

最后我们看下QT有哪些具体优势

1. 工具丰富

这个前面已经对它的工具做了介绍。

2. 功能丰富

出了提供了界面库之外,还提供了音频库,3d库,数据库SDK,WebEngine,网络库等,让我们做跨平台程序变得简便。

3. 开源并跨平台

出了可以自己通过QT源码进行移植之外,qt官方就已经提供了再windows,Android,ios,linux中运行的SDK。

4. 架构的优势

这部分优势很多,我们列出一些示例,可以看出它的优势。界面源码与用户源码的隔离,qt的策略是没有界面都会生成一个对应的源码,比如有一个界面设计文件xps.ui 它会解析其中的xml生成一个对应了ui_xps.h 文件,这个文件你不需要修改,如果要调用界面中的控件直接通过 Ui::XPSClass ui; 这个对象定义也是写在ui_xps.h中。也就是你的业务逻辑就和界面控件对象的创建和设置做了隔离。

事件处理的便捷(灵活的信号槽机制),qt提供了信号槽机制,可以很好的降低耦合,提升代码的复用性。

例如有这样一个需求,我的一个XMov类专门处理视频,但要把处理进度告知外部界面XSlider的对象,我处理方法,可以XMov提供接口给外部获取进度,或者是主动调用外部接口来刷新显示进度,第一种方法实时性得不到保障,并且界面端程序也需要引入XMov类头文件,也就是做了关联。第二种方法使得XMov类的耦合性加大,当界面发生变化是XMov类需要修改。QT中了信号槽机制可以让两个类XMov和XSlider关联起来,在XMov中直接定义一个信号函数void SetPos(int),直接绑定到XSlider对象的void SetPos(int) 槽函数,二者互相都不知道,降低耦合性。只在统一的入口类中将各个模块直接的信号槽关联起来。

XMov::run()
{
  while(!sExit)
  {
    //处理视频
    int pos = DealMove();
    //发出信号,信号如果没有绑定,这步调用也不会出问题
    SetPos(pos);
  }
}
//绑定方法
connect(xmov,SIGNAL(SetPos(int)),xslider,SLOT(SetPos(int)))

这就是信号槽的一种好处,当然信号槽也是处理各类控件的自定义事件。

5. 及其便捷的样式设计(像开发web程序一样设计界面)

可以很容易的做一个圆角边框,并且有渐变效果,鼠标移上去还发生变化,可以参考下面的样式表,qss基本和css类似,包括支持css的选择器,可以通过类名,对象名,和父类名称来设置。


QPushButton:!hover
{
  background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(120, 120, 120, 255), stop:0.495 rgba(39, 39, 39, 255), stop:0.505 rgba(39,39, 39, 255), stop:1 rgba(120, 120,120, 255));
  border-radius:5px;
}
QPushButton:hover /* hover 鼠标悬停*/
{
  background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(39, 39, 39, 255), stop:0.495 rgba(120, 120, 120, 255), stop:0.505 rgba(120,120, 120, 255), stop:1 rgba(39, 39,39, 255));
  border-radius:5px; /*圆角边框*/
}

QT的学习进阶路线:

成为Qt开发大牛,从入门到精通,一步一步走完整个学习路线!_qt高级进阶-CSDN博客

粉丝福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,Qt信号与槽机制,Qt界面开发-图像绘制,Qt网络,Qt数据库编程,Qt项目实战教程,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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

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

相关文章

hexo github部署,通过域名访问你的博客

hexo github部署,通过域名访问你的博客 hexo 常用命令hexo github 部署 在部署之前,了解一下hexo的常用命令 hexo 常用命令 hexo new "My New Post" # 新建文章 hexo n "My New Post"hexo generate # 生成静态文件 hexo ghexo serv…

【CTF】Nginx日志注入

Nginx日志注入: 日志包含漏洞的成因还是服务器没有进行严格的过滤 ,导致用户可以进行任意文件读取,但是前提是服务器需要开启了记录日志的功能才可以利用这个漏洞。 对于Apache,日志存放路径:/var/log/apache/access.l…

【论文阅读】FedBABU:TOWARD ENHANCED REPRESENTATION FOR FEDERATED IMAGE CLASSIFICATION

算法流程: 训练过程中冻结客户端的头部参数,只训练主体参数。训练完之后再在客户端本地跑几个epoch微调一下(文章推荐5个)。 由于该算法与FedPer思路过于相似,故读完后跑了个实验。 FedPer:训练过程中只聚合主体参数。…

Redis --- redis事务和分布式事务锁

redis事务基本实现 Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现事务(transaction)功能。 > MULTI OK > SET USER "Guide哥" QUEUED > GET USER QUEUED > EXEC 1) OK 2) "Guide哥"使用 MULTI命令后可以输入…

Linux应用开发实验班——JSON-RPC

目录 前言 1.是什么JSON-RPC 2.常用的JSON函数 1.创建JSON 2.根据名字获取JSON 3.获取JSON的值 4.删除JSON 3.如何进行远程调用 服务器 客户端 4.基于JSON-RPC进行硬件操作 课程链接 前言 学习的课程是百问网韦东山老师的课程,对更详细步骤感兴趣的同学…

LINUX网络编程:Tcp(2)

目录 1.Tcp流量控制 2.滑动窗口 2.1滑动窗口的更新 2.2滑动窗口的丢包问题 1.报文丢失的情况 2.ACK丢失的情况 3.拥塞控制 3.1慢启动 3.2拥塞窗口的增长 1.Tcp流量控制 为什会有流量控制? 1.在网络通信中,假如发送方的发送能力特别的强&#xff0…

支付宝沙箱环境 支付

一 什么是沙箱: 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境 支付宝正式和沙箱环境的区别 : AI: 从沙箱到正式环境: 当应用程序开发完成后,需要将应用程序从沙箱环境迁移到正式环境。 这通常涉及…

opencv图像增强十四:opencv两种白平衡介绍及实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、白平衡介绍二、灰度世界法三、完美反射法 前言 在摄影与影像领域,白平衡是一个至关重要的概念。它直接影响着画面的色彩表现,关系到…

构建网络遇到的问题-AlexNet

1.对模型进行初始化采用的一般代码 def _initialize_weights(self):for m in self.modules(): # 遍历模型每一层if isinstance(m, nn.Conv2d): # 判定m层是否属于nn.Conv2d类型nn.init.kaiming_normal_(m.weight, modefan_out, nonlinearityrelu)if m.bias is not None:nn.in…

从自动化到智能化:AI如何推动业务流程自动化

引言:从自动化到智能化的必然趋势 在当今数字化时代,企业为了提升效率、降低成本,纷纷采用自动化技术来简化重复性任务。然而,传统自动化仅限于标准化操作,无法应对复杂的决策和多变的市场环境。随着人工智能&#xff…

基于springboot垃圾分类网站

基于springboot垃圾分类网站 摘 要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述垃圾分类网站的当…

Android开发拍身份证带人像框和国徽框效果

Android开发拍身份证带人像框和国徽框效果 拍身份证时往往要带上外框辅助用户拍照,这也是很常见的需求。 一、思路 自定义Camera和自定义拍照的界面,把外框画上去,做个遮罩 二、效果图: Android开发教程实战案例源码分享-拍身…

深入理解计算机系统-Bomb Lab

使用 头歌 平台 GDB 调试器 反汇编函数

动力锂电池电芯壳体市场前景:预计2030年全球市场规模将达到49.2亿美元

动力锂电池罐起着传输能量、承载电解液、保护安全等重要作用,是锂电池的重要组成部分。 据QYResearch调研团队最新报告“全球动力锂电池电芯壳体市场报告2024-2030”显示,预计2030年全球动力锂电池电芯壳体市场规模将达到49.2亿美元,未来几年…

分布式算法

分布式场景下的核心问题 分布式场景下困扰我们的3个核心问题(CAP):一致性、可用性、分区容错性。 1、一致性(Consistency):无论服务如何拆分,所有实例节点同一时间看到是相同的数据。 2、可用性…

开源链动 2+1 模式 S2B2C 商城小程序:社交电商团队为王的新引擎

摘要:本文深入探讨在社交电商领域中,团队的重要性以及如何借助开源链动 21 模式 S2B2C 商城小程序,打造具有强大竞争力的团队,实现个人价值与影响力的放大,创造被动收入,迈向财富自由之路,同时为…

从汽车高速线束角度浅谈中控屏黑屏、闪屏及信号阈值低故障-之AEM线束测试仪应用案例

故障成因和解决方案 随着车载信息娱乐技术的迅速发展,中控屏已经成为现代汽车的标配。然而,许多主机厂和消费者在车辆使用过程中常常遇到中控屏出现黑屏、闪屏以及信号阈值低等问题,给使用带来了诸多困扰。本文将从汽车高速线束的角度&#…

GPU服务器本地搭建Dify+xinference实现大模型应用

文章目录 前言一、显卡驱动配置1.检测显卡2.安装驱动 二、安装nvidia-docker二、安装Xinference1.拉取镜像2.运行Xinference3.模型部署 三、安装Dify1.下载源代码2.启动 Dify3.访问 Dify 四、Dify构建应用1.配置模型供应商2.聊天助手3.Agent 前言 本文使用的GPU服务器为UCloud…

MySQL: 数据类型介绍

文章目录 数据类型数值类型字符串类型日期类型 数据类型 数值类型 分为整型和浮点型: BIT类似于数据结构中的位图,BIT可以认为是一组二进制bit位. BIT(10)表示这个类型里就存最多10个bit位. 虽然TINYINT和SMALLINT更节省空间,但是还是更推荐使用INT或者BIGINT. 如果存储空间…

MySql语言操作数据库---增删改查数据库,表,数据

思维导图 SQL语言共分为四大类: 数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象-----[库]、[表]、[视图]、[索引]、 数据操纵语言DML:(1) 插入:INSERT (2) 更新:UPDATE (3) 删除:DELETE 数据查询语言DQL:数据查询语…