有没有办法为每个 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);
        }
    }
}