首先添加資源文件source.qrc
在cmake文件中添加如下代碼(根據路徑不同酌情更改,比如我是將source.qrc文件創建在source文件夾中的):
set(Qrc_Files
source/source.qrc
)
新建style.qss樣式文件(我的做法是在qss文件夾中新建文本文件,改名叫style.qss),點擊添加前綴,一般來說前綴用【/】足夠了,如果有多個qrc文件,想要區分的話可以將前綴改成不一樣的。點擊添加文件將qss文件添加到資源文件中,如圖所示就是已經添加成功了,雙擊這個qss文件,編輯一下,將想要的樣式填寫進去。
在cmake文件中添加如下代碼(add_executable中的PROJECT_SRCS等根據自己的情況添加,別把這些全部抄進自己的代碼):
qt5_add_resources(QRC_FILES ${Qrc_Files})
add_executable(${PROJECT_NAME}
WIN32
${PROJECT_SRCS}
${PROJECT_UIS}
${QRC_FILES}
)
接下來就是重頭戲了,我的做法是通過遍歷文件夾中以qss結尾的文件,並將文件全部加載到QString變量中,最後使用這個變量設置app的樣式:
void setQssFile()
{
//qss模板
QString qss = "";
//設置qss文件夾路徑(相對路徑和絕對路徑都可)
QDir dir(":/qss");
QFileInfoList fileList = dir.entryInfoList();
qDebug() << QStringLiteral("--------從資源目錄讀取qss文件begin--------");
qDebug() << QString("Dir %1 is exists:").arg(dir.absolutePath()) << dir.exists();
foreach(QFileInfo fileItem, fileList) {
if (fileItem.isFile() && fileItem.suffix() == QString("qss")) {
qDebug() << "absoluteFilePath:"<<fileItem.absoluteFilePath();
QFile specifyStylefile(fileItem.absoluteFilePath());
specifyStylefile.open(QFile::ReadOnly);
qss += QString::fromUtf8(specifyStylefile.readAll());
specifyStylefile.close();
}
}
qDebug() << QStringLiteral("--------從資源目錄讀取qss文件end--------");
qApp->setStyleSheet(qss);
}
將這個函數添加到main.cpp中,並在main函數中直接調用,就可以將qss文件中的所有qss文件加載到應用中啦。
注:我一開始沒有添加qt5_add_resources代碼,結果發現用這個方法,會提示我這個目錄不存在:
用@一去丶二三裏在Qt 之加載 QSS 文件中所說的方法去加載單個qss也不行,一直提示我說:
QIODevice::read (QFile, ":\qss\style.qss"): device not open
這個事情折磨了我很長時間,上網搜索發現沒人遇到過qss文件加載不出來的問題,覺得非常奇怪——難道大家的都可以,只有我的這個不行嗎?於是我創建了一個qmake的工程,在qmake工程中用這個方法去加載,發現qmake的工程就沒有這個問題,添加完qrc和qss文件之後,不用在工程文件中添加其他代碼就可以加載出制定樣式,用cmake的人苦啊,要多學一些cmake語法不說,還那麼多的坑,真的是無語......