最近在研究qt界面開發,發現使用qss對界面進行美化后效果不錯,要比mfc效率高很多,美化效果也很出色。但是在使用qss文件對界面控件進行美化的過程中遇到了個很奇葩的問題,困惑了我好久,今晚又遇到了,感覺整個人都不好了,問題症狀如下:
(1)我在Qt Creator中新建了一個工程,添加qss文件及內容后運行,加載qss文件並運行程序,qss美化效果死活出不來(經檢查,qss內容及加載過程都正確);
(2)在Qt Creator中打開一個現有項目,該項目中含有qss文件,能正確加載,在別的電腦上也驗證過美化效果能出來,在我電腦上直接運行也有效果,但是我更改了qss文件的內容后,再運行,所有qss美化效果都沒了。
通過從網上查詢,最終參考別人的意見並自己測試,最終解決,基本確定是qss編碼問題造成的,解決方案如下:
(1)在項目中選中qss文件,右擊/用...打開/System Editor。如下圖:

(2)文件/另存為/編碼方式選擇ANSI/保存

(3)提示框問是否替換?/是

(4)Qt Creator/工具/選項/文本編輯器/行為/UTF-8 BOM選擇“總是刪除”。

(5)重新qmake/構建/運行程序,解決了,qss美化效果出來了。
原因分析:
感覺是由於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對不上號也不報錯,這到底是優點還是缺點呢?我感覺是方便了初級開發者,復雜了對運行時的深度控制判斷。
