有没有办法为每个 OS 启用 qss 样式表部件?
Is there a way to enable qss stylesheets parts per OS?
有没有办法根据 OS(平台)enable/disable 部分 qss 样式表。这样我就可以为 MacOS 启用一种字体,为 Windows.
启用另一种字体
我可以为特定的小部件设置动态属性
this->setProperty("qsysKernelType", QSysInfo::kernelType());
this->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture());
this->setProperty("qsysBuildCpuArchitecture", QSysInfo::buildCpuArchitecture());
this->setProperty("qsysProductType", QSysInfo::productType());
但这只适用于一个小部件,不适用于整个层次结构。
我认为没有标准的简单方法。
但您始终可以将不同平台的 CSS 资源保存在不同的文件中,并使用 ifdefs 来加载它,例如:
this->setStyleSheet(QFile(
#ifdef Q_OS_WIN
":/style/win.css"
#else // add more, if you need
":/style/mac.css"
#endif
).readAll());
或者简单地使用带有 ifdefs 的两个硬编码字符串。
实际上,我们现在结合使用了 Youw 的答案和问题中提到的方法。
对于条件 qss
检查,我们为特定小部件或小部件树设置属性。
void CStyleSheetUtility::setQSysInfoProperties(QWidget *widget, bool withChildWidgets)
{
Q_ASSERT_X(widget, Q_FUNC_INFO, "Missing widget");
if (!widget->property("qsysKernelType").isValid())
{
widget->setProperty("qsysKernelType", QSysInfo::kernelType());
widget->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture());
widget->setProperty("qsysBuildCpuArchitecture", QSysInfo::buildCpuArchitecture());
widget->setProperty("qsysProductType", QSysInfo::productType());
}
if (withChildWidgets)
{
for (QWidget *w : widget->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly))
{
CStyleSheetUtility::setQSysInfoProperties(w, true);
}
}
}
有没有办法根据 OS(平台)enable/disable 部分 qss 样式表。这样我就可以为 MacOS 启用一种字体,为 Windows.
启用另一种字体我可以为特定的小部件设置动态属性
this->setProperty("qsysKernelType", QSysInfo::kernelType());
this->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture());
this->setProperty("qsysBuildCpuArchitecture", QSysInfo::buildCpuArchitecture());
this->setProperty("qsysProductType", QSysInfo::productType());
但这只适用于一个小部件,不适用于整个层次结构。
我认为没有标准的简单方法。
但您始终可以将不同平台的 CSS 资源保存在不同的文件中,并使用 ifdefs 来加载它,例如:
this->setStyleSheet(QFile(
#ifdef Q_OS_WIN
":/style/win.css"
#else // add more, if you need
":/style/mac.css"
#endif
).readAll());
或者简单地使用带有 ifdefs 的两个硬编码字符串。
实际上,我们现在结合使用了 Youw 的答案和问题中提到的方法。
对于条件 qss
检查,我们为特定小部件或小部件树设置属性。
void CStyleSheetUtility::setQSysInfoProperties(QWidget *widget, bool withChildWidgets)
{
Q_ASSERT_X(widget, Q_FUNC_INFO, "Missing widget");
if (!widget->property("qsysKernelType").isValid())
{
widget->setProperty("qsysKernelType", QSysInfo::kernelType());
widget->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture());
widget->setProperty("qsysBuildCpuArchitecture", QSysInfo::buildCpuArchitecture());
widget->setProperty("qsysProductType", QSysInfo::productType());
}
if (withChildWidgets)
{
for (QWidget *w : widget->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly))
{
CStyleSheetUtility::setQSysInfoProperties(w, true);
}
}
}