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

继续讲一些Qt开发中的技巧操作:

1.自带对话框的美化

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

cpp 复制代码
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文件,这样就将资源文件单独出来了,可在需要的时候动态加载。

cpp 复制代码
//Qt中使用二进制资源文件方法如下
//将qrc编译为二进制文件rcc,在控制台执行下列命令
rcc -binary main.qrc -o main.rcc
//在应用程序中注册资源,一般在main函数启动后就注册
QResource::registerResource(qApp->applicationDirPath() + "/main.rcc");
相关推荐
岁岁岁平安几秒前
Java基础(Arrays工具类)(asList()方法)(详细)
java·开发语言·集合·arrays·aslist
窦再兴2 分钟前
关于Java中的List<User>如何进行深拷贝
java·list
健康平安的活着4 分钟前
redis 中IO多路复用与Epoll函数
网络·数据库·redis
WHabcwu11 分钟前
Spring Web MVC⼊⻔
java·后端·spring·mvc
coffee_baby14 分钟前
《解锁高效流程设计:深度剖析责任链模式与实战应用》
java·开发语言·责任链模式
customer0817 分钟前
【开源免费】基于SpringBoot+Vue.JS服装销售平台(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
江凡心17 分钟前
Qt 每日面试题 -5
服务器·数据库·qt·学习·面试
晴子呀20 分钟前
一个有趣的编程题实战----交替打印线程
java·开发语言
叶辰 .38 分钟前
POI获取模板文件,替换数据横纵动态表格、折线图、饼状图、折线饼状组合图
java
胡净1 小时前
java并发线程02
java·开发语言