簡體   English   中英

設置樣式表后,Qt Customwidget 外觀不會改變

[英]Qt Customwidget appearance not changing after setting stylesheet

我想提供一個系統來為我的應用程序編寫自己的 Styesheets。 我像這樣加載樣式表:我使用 QFileInfo 來檢查文件是否存在(就像在這篇文章中如何檢查文件是否存在於 Qt in c++ 中

bool Settings::fileExists(const QString &path)
{
    QFileInfo check_file(path);
    if (check_file.exists() && check_file.isFile()) {
        return true;
    } else {
        return false;
    }
}

然后我打開文件

QString filePath = stylesPath + "/"  + text;
    if(fileExists(filePath)) {
        QFile stylesheetFile(filePath);
        stylesheetFile.open(QFile::ReadOnly | QFile::Text);
        QString newStylesheet = QLatin1String(stylesheetFile.readAll());
        stylesheetFile.close();
        if(m_previewFrame) {
            m_previewFrame->setStyleSheet(newStylesheet);
            m_previewFrame->style()->unpolish(m_previewFrame);
            m_previewFrame->style()->polish(m_previewFrame);
            m_previewFrame->update();
        }
    }
    qDebug()  << m_previewFrame->styleSheet();
}

Edit3:m_previewframe 是一個 Qframe 對象,我想更改一個 customWidget 的樣式,它是 m_previewFrame 的子項。 我是否必須為每個孩子打磨/取消打磨,而只為 QFrame 打磨?

樣式表用於自定義小部件,因此像本文中的那樣覆蓋了paintEvent 自定義小部件的 Qt 樣式表編輯:使用 QFile::Text 很重要( 無法使用 qss 文件設置樣式表屬性

如果我運行它,它會像這樣打印出文件的內容

"CustomWidget{\n\tbackground-color:black;\n}"

但它只重新加載一次樣式。 如果我嘗試像這樣直接傳遞 QString :

auto newStyleSheet = QString("CustomWidget{background-color:black;}");
m_previewFrame->setStyleSheet(newStylesheet);
m_previewFrame->style()->unpolish(m_previewFrame);
m_previewFrame->style()->polish(m_previewFrame);
m_previewFrame->update();

它有效。 編輯:第一個例子也有效。 但它只工作一次。 如果我設置了一個樣式表,它就不會更新另一個樣式表。

Edit2:這絕對是一個更新問題,既不是波蘭語/取消波蘭語 + update() 也不是 ensurePolished() + update() 工作。
我不確定如何強制我的 QFrame 及其子項重新渲染。
Qt 不拋光:

請注意,只有在小部件被銷毀時才會調用 unpolish()。 在某些情況下,這可能會導致問題,例如,如果您從 UI 中刪除小部件,將其緩存,然后在樣式更改后重新插入; Qt 的一些類緩存它們的小部件。

這意味着我必須銷毀對象?

我正在使用 C++17、Qt Creator 4.9.2 和桌面 Qt 5.13.0 MinGW 64 位

我不確定這是否有幫助,但不需要覆蓋自定義小部件的 QEvent::Paint 以便能夠將樣式表應用於它們。 它甚至可能會給您帶來問題,因為只請求繪制 QStyle::PE_Widget 元素,而 Qt 可以為您繪制更多其他元素。 此外, QWidget::setStyleSheet() 應該自動為您取消拋光和拋光所有內容,因此不需要重新拋光。 換句話說,您只需要以下幾行:

auto newStyleSheet = QString("CustomWidget{background-color:black;}");
m_previewFrame->setStyleSheet(newStylesheet);

我不確定它是否會起作用,但正如我所嘗試的(通過 QTextEdit 設置它),它在設置樣式表的次數中沒有任何問題。 無論如何,問題應該出在其他地方。 順便說一下,我使用的是 C++11、Qt Creator 4.8.2 和 Qt5.9.8。 也許較新的 Qt 版本有這種類型的錯誤? 我非常懷疑 C++17 或 Qt Creator 4.9.2 會導致任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM