Qt cmake工程加載文件夾中的所有qss樣式表

首先添加資源文件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語法不說,還那麼多的坑,真的是無語......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章