Qt自定义小部件外观在设置样式表后没有变化
Qt Customwidget appearance not changing after setting stylesheet
我想提供一个系统来为我的应用程序编写自己的Styesheets。我像这样加载样式表: 我使用 QFileInfo 来检查文件是否存在(如本文如何检查 c++ 中的 Qt 中是否存在文件(
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();
}
编辑3:m_previewframe是一个Qframe对象,我想改变自定义小部件的样式,它是m_previewFrame的子项。我是否必须为每个孩子抛光/取消抛光,而不是只为QFrame抛光?
样式表用于自定义小部件,因此已覆盖 paintEvent,如本文中的 Qt 样式表用于自定义小部件 编辑:使用 QFile::Text 很重要(无法使用 qss 文件设置样式表属性(
如果我运行它,它会像这样打印出文件的内容
"CustomWidget{ntbackground-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();
它有效。 编辑:第一个示例也有效。但它只工作一次。如果我设置了一次样式表,它不会更新其他样式表。
编辑2:这绝对是一个更新问题,既不是抛光/取消抛光+ update((也不是ensurePolished(( + update((工作。
我不确定如何强制我的 QFrame 及其子级重新渲染。
Qt un抛光:
请注意,unpolish(( 只有在小部件被销毁时才会被调用。在某些情况下,这可能会导致问题,例如,如果您从 UI 中删除小部件,缓存它,然后在样式更改后重新插入它;Qt的一些类缓存了他们的小部件。
这意味着我必须摧毁物体?
我正在使用 C++17 、Qt Creator 4.9.2 和桌面 Qt 5.13.0 MinGW 64 位
我不确定这是否有帮助,但是为了能够将样式表应用于自定义小部件,不需要覆盖自定义小部件的QEvent::P aint。它甚至可能会给您带来问题,因为只有QStyle::P E_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会导致任何问题。
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- cin>>gender 和 cin>>*gender ( c 样式文本字符串)有什么区别
- 为什么尽管源代码没有变化,但每个系统的片段数量却有很大差异?
- Qt自定义小部件外观在设置样式表后没有变化
- 当我有多个类时,我应该以线性样式包含它们还是只包含在 main.cpp 中?
- 是否有具有用户定义的冲突处理程序的 std::唯一样式库算法
- 从旧的 C 样式指针移动到C++智能指针,代码几乎没有变化
- 如何在C++中有条件地设置 C 样式字符串?
- Qt样式表和QML有什么区别
- 有可能在C++中的值发生变化时触发计算吗
- 有没有办法修改样式表,以便它将带有空标记的 XML 文档转换为 <tag />?
- §12.3.2 [class.conv.fct]/1 in C++1z 相对于 C++14 发生了重大变化。有意义吗?
- 有一个构造函数块是可以接受的样式吗
- VS 2012 中可能有什么变化来破坏我的C++应用程序?
- Qt - 当值发生变化时,QSpinBox 上每个失去焦点的信号是否有信号
- 以下4种样式调用其他成员方法有什么区别?
- 对非指针类型使用 static_cast 而不是 C 样式强制转换有什么好处
- 是否有正当理由在C++中使用 C 样式数组
- 条件样式不断变化的 IF 性能
- c++ STL标准是否有变化?