Qt开发技巧(八)自带对话框的美化,内置快捷代码段,巧用匿名槽函数,另类动态换肤,资源动态加载

news/2024/9/28 15:33:20/

继续讲一些Qt开发中的技巧操作:
1.自带对话框的美化
Qt中有一些自带的对话框,比如文件选择对话框,颜色选择对话框等等,这些对话框看着跟系统的对话框没太大差别,实际这是Qt有意为之,为的是跟系统保持一致。但实际是可以美化这些对话框的,做出你自己风格的样式,只需要设置一个属性。

QFileDialog *fileDialog = new QFileDialog(this);
//不设置此属性根本查找不到任何子元素,因为默认采用的系统对话框
fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);
qDebug() << fileDialog->findChildren<QLabel *>();

当设置了这个属性后,你就可以对里边的子控件进行样式设置进行美化。

在这里插入图片描述
2.内置快捷代码段
QtCreator集成开发环境,也内置了对快速添加注释的支持,比如最常用的在头文件开头添加一大段通用模板的注释,标注文件创建者、时间等信息。
在菜单->工具->选项->文本编辑器->右侧tab页面片段(snippets);选择“C++”,看到蛮多注释样例。
在这里插入图片描述
使用方法很简单,比如你要快速创建一个继承自QObject的类,只要写代码时输入“class”,就会有很多快捷提示,如果你选择“class derived from QObject”,会自动给你创建一个继承自QObject的类,够方便吧~
在这里插入图片描述
在这里插入图片描述
3.巧用匿名槽函数
Qt完全支持标准C++的规则(新版本都尽量第一时间加入最新的标准进去了)比如说lambda表达式。在Qt中一些简单的处理逻辑强烈推荐直接使用lambda表达式直接处理完,他有个专用称呼叫:匿名槽函数。
普通写法:
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::test_fun);
void MainWindow::test_fun()
{
QMessageBox::about(this, “title”, “button clicked!!”);
}
匿名槽函数写法:
connect(ui->pushButton, &QPushButton::clicked, this, ={
QMessageBox::about(this, “title”, “button clicked!!”); });
//另类写法,支持lambda表达式,直接执行代码
connect(ui->pushButton, &QPushButton::clicked, [this] {test_fun();});
是不是很方便,当然也可以传参等等,去好好研究下吧~
4.另类动态换肤
Qt样式表有多种运行机制,继承自QWidget的类和qApp类都支持setStyleSheet方法,根据各种需求场景,还可以统一将样式表放在文件,或者将样式文件加入到资源文件,多研究样式表的接入方式,和应用方法,可以更规范更巧妙的完成一些动态换肤等高端操作。

比如下面阶梯式接入方式:
老板拿你当仇寇:那个控件需要要样式,直接对应控件鼠标右键弹出菜单选择改变样式表填入内容;
老板拿你当猪仔:qss内容写得到处都是,哪里需要就写在哪里,各种控件调用 setStyleSheet方法传入样式表内容;
老板拿你当牛马:qss内容放在文件,读取文件内容设置样式表,程序发布的时候带上qss文件;
老板拿你当员工:qss文件作为资源文件放到qrc文件,直接编译到可执行文件中,防止篡改;
老板拿你当心腹:在qss文件中自定义一些标志充当变量使用,读取以后替换对应的变量为颜色值,类似动态
换肤;
老板拿你当亲儿子:放在文件容易被篡改,集成到可执行文件不够灵活,一旦样式表更新需要重新编译文件,如何做到既能只更新样式表文件,又不需要重新编译可执行文件,又能防止被篡改:采用rcc命令将资源文件编译生成二进制,只需要替换该二进制文件即可;
你就是老板:继承qstyle类自己实现完成所有样式接口,统一整体风格,大名鼎鼎新一代国产Linux操作系统UOS的默认规则就是如此,不允许用样式表,全部painter绘制,没错UOS操作系统的桌面就是用Qt编写的。当然如果你的程序就是运行在UOS上,并且你也用Qt编写,如果遇到一些深度问题,UOS的技术支持老师会告诉你,UOS桌面就是用Qt编写的,可能是这块引起的冲突,哈哈;

5.资源动态加载
当Qt中编译资源文件太大时,效率很低,或者需要修改资源文件中的文件比如图片、样式表等,需要重新编译可执行文件,这样就很麻烦。其实Qt都给我们考虑好了策略,此时可以将资源文件转化为二进制的rcc文件,这样就将资源文件单独出来了,可在需要的时候动态加载。

//Qt中使用二进制资源文件方法如下
//将qrc编译为二进制文件rcc,在控制台执行下列命令
rcc -binary main.qrc -o main.rcc
//在应用程序中注册资源,一般在main函数启动后就注册
QResource::registerResource(qApp->applicationDirPath() + "/main.rcc");

在这里插入图片描述


http://www.ppmy.cn/news/1531553.html

相关文章

AI大模型日报#0923:李飞飞创业之后首个专访、华为云+腾讯音乐发布昇腾适配方案

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

一步一步丰富生成式语言模型系统

以下是这套生成式语言模型解决任务的流程图概述&#xff1a; #mermaid-svg-sRHDSMUMV1utrg2F {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sRHDSMUMV1utrg2F .error-icon{fill:#552222;}#mermaid-svg-sRHDSMUMV1u…

宝塔搭建nextcould 30docker搭建onlyoffic8.0

宝塔搭建nextcould 宝塔搭建nextcould可以参考这两个博文 我搭建的是30版本的nextcould&#xff0c;服务组件用的是下面这些&#xff0c;步骤是一样的&#xff0c;只是版本不一样而已 nginx 1.24.0 建议选择nginx&#xff0c;apache没成功。 MySQL 8.0以上都可以 php 8.2.…

高度细化的SAGA模式实现:基于Spring Boot与RabbitMQ的跨服务事务

场景与技术栈 场景&#xff1a;电商系统中的订单创建流程&#xff0c;涉及订单服务&#xff08;Order Service&#xff09;、库存服务&#xff08;Inventory Service&#xff09;、支付服务&#xff08;Payment Service&#xff09;。 技术栈&#xff1a; Java 11 Spring Bo…

Vue3(五) 组件通信大汇总

文章目录 一、props二、自定义事件三、mitt四、v-model1.v-model的本质2.v-model用在组件标签上3.更换modelValue4.更换modelValue时&#xff0c;可以在组件标签上多次使用v-model 五、$attrs六、$refs,与&#xffe5;parent1. 回顾标签ref属性修改组件信息2. $refs实现父修改所…

20240925软考架构-------软考196-200答案解析

每日打卡题196-200答案 196、在选择架构时&#xff0c;更适合选择Kappa架构的情况是&#xff08; &#xff09;。 A. 需要频繁修改算法模型参数 B. 依赖Hadoop进行批处理 C. 项目中需要大规模历史数据处理 D. 需要分离批处理层和速度层 答案&#xff1a; A 解析&#xff1a;如…

电子连接器信号完整性仿真实训教程 一

电子连接器信号完整性仿真学习除需要熟悉软件的基本操作外&#xff0c;还需要基本的实际操作练习才能完全掌握&#xff0c;学以致用。因此推出几期实训教程&#xff0c;教程中将不再详细讲怎么一步一步操作软件&#xff0c;重点讲一些步骤&#xff0c;及一些技巧。也会将连接器…

Java实现找色和找图功能

某天&#xff0c;张三接到一个任务需求&#xff0c;将一个Excel表格里面的员工信息&#xff0c;录入到员工系统里面&#xff0c;由于数据量非常大&#xff0c;操作起来巨慢。经过一段时间的操作和观察&#xff0c;他发现这种操作&#xff0c;非常有规律&#xff0c;基本就是一些…