最近在研究qt界面开发,发现使用qss对界面进行美化后效果不错,要比mfc效率高不少,美化效果也很出色。可是在使用qss文件对界面控件进行美化的过程当中遇到了个很奇葩的问题,困惑了我很久,今晚又遇到了,感受整我的都很差了,问题症状以下:html
(1)我在Qt Creator中新建了一个工程,添加qss文件及内容后运行,加载qss文件并运行程序,qss美化效果死活出不来(经检查,qss内容及加载过程都正确);编辑器
(2)在Qt Creator中打开一个现有项目,该项目中含有qss文件,能正确加载,在别的电脑上也验证过美化效果能出来,在我电脑上直接运行也有效果,可是我更改了qss文件的内容后,再运行,全部qss美化效果都没了。函数
经过从网上查询,最终参考别人的意见并本身测试,最终解决,基本肯定是qss编码问题形成的,解决方案以下:工具
(1)在项目中选中qss文件,右击/用...打开/System Editor。以下图:测试
(2)文件/另存为/编码方式选择ANSI/保存编码
(3)提示框问是否替换?/是spa
(4)Qt Creator/工具/选项/文本编辑器/行为/UTF-8 BOM选择“老是删除”。code
(5)从新qmake/构建/运行程序,解决了,qss美化效果出来了。htm
缘由分析:blog
感受是因为qss编码问题形成的,个人qss文件是经过在工程目录下建一个txt文件,而后改成qss文件,再加到工程里来的,怀疑这个过程当中有编码不统一问题。在网上搜索了半天只搜到一篇于此相关的文章,感受对我帮助很大,在此表示感谢!网址为:http://www.vbgudu.com/html/20160628/53209.html。怕之后找不到,特将内容直接贴在下面:
【qss功能须要正确设置编码才能起做用】
QT这个库,无非使用OO对跨平台作了绝佳的封装,这其中的主要工做也就是比较繁琐而已,但并很少么了不得。惟独其中提供的QSS功能,让我感到十分神奇,作出来的效果实在很惊艳,而使用代码却又是如此简单,并且是在长期以来中规中冷冰冰的C++编译器上提供这些功能,实在是刮过业界一个新风。也让我认识到,不是什么功能都是编译器提供的,编写库的人,在普通的编译器规则上,照样能够作出各类惊艳的效果来。
可是最近碰到一个问题,就是个人QSS设置效果在开发机上好好的,而且本身开的虚拟机上也是好好的,可是公司同事机上死活没有效果。这个问题疑惑了好久了,今天终于灵光一闪,解决了这个问题。缘由仍是出在QSS文件编码格式上。出于跨平台和多语言考虑,我把项目全部源文件都改为了UTF8+BOM格式,这个QSS文件也不例外(个人QSS文件里不含有中文字符)。读取QSS的代码在main函数里这样写:
QFile qss(":/qss/myfile"); qss.open(QFile::ReadOnly); // qss 也要讲究是什么格式的文件读取 qApp->setStyleSheet(qss.readAll()); qss.close();
我是在中文环境下开发的,因而它按照ANSI格式去读取QSS文件了,也不知道为何就没问题。估计是文件头上的三个字节EF BB BF都被看成中文读出来了,而后试图去匹配QSS自带关键字,都对不上,而后就被忽略了,后面继续读取的话,那都是正确的。可是同一个文件一样的代码,到西文环境下,可能成功匹配几个字母,后面的却再也对不上号,因而就所有忽略了。这就是为何个人程序QSS效果在同事机子上始终没有效果的缘由。解决方案是把QSS文件转成为ANSI,或者不带BOM的UTF8格式,从新编译,而后效果就又从新出现啦。哦,原来这样啊,QSS文件就不能和ts语言文件同样作的更内置一点呢?
另外就是QT对它本身的错误控制的很好,不轻易报错,这里QSS读不出来、对不上号不报错,SIGNAL对SLOT对不上号也不报错,这究竟是优势仍是缺点呢?我感受是方便了初级开发者,复杂了对运行时的深度控制判断。