【发布时间】:2020-01-05 09:43:32
【问题描述】:
我想提供一个系统来为我的应用程序编写自己的样式表。我像这样加载样式表: 我使用 QFileInfo 来检查文件是否存在(如本文How to check whether file exists in 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 对象,我想更改作为 m_previewFrame 子级的 customWidget 的样式。我是否必须为每个孩子抛光/取消抛光,而不是只为 QFrame?
样式表用于自定义小部件,因此已覆盖本文中的paintEvent Qt Stylesheet for custom widget 编辑:使用 QFile::Text (Unable to set stylesheet properties using qss file) 很重要
如果我运行它,它会像这样打印出文件的内容
"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:这绝对是一个更新问题,polish/unpolish + update() 和 ensurePolished() + update() 都不起作用。
我不确定如何强制我的 QFrame 及其子项重新渲染。
Qt 未抛光:
请注意,unpolish() 只有在小部件被销毁时才会被调用。这在某些情况下可能会导致问题,例如,如果您从 UI 中删除一个小部件,缓存它,然后在样式更改后重新插入它; Qt 的一些类缓存它们的小部件。
这意味着我必须销毁对象?
我正在使用 C++17、Qt Creator 4.9.2 和 Desktop Qt 5.13.0 MinGW 64 Bit
【问题讨论】:
-
“qDebug() styleSheet();”的输出是什么当您像在第二个工作示例中那样设置样式时?您加载文件的方式似乎是正确的,我做的基本相同,它对我有用。这在我看来 \r\n\ 可能是问题所在。
-
输出类似于字符串。如果我使用 QString::simplified 我得到完全相同的字符串并摆脱 \r\n 但不知何故它不起作用。我还注意到,如果我在更改 CustomWidget 的 MainWindow 中没有加载样式表,则第二个示例才有效。
标签: c++ qt qt5 qtstylesheets