Qt 有没有一种方法可以为每个操作系统启用qss样式表部件?

Qt 有没有一种方法可以为每个操作系统启用qss样式表部件?,qt,qtstylesheets,Qt,Qtstylesheets,是否有一种方法可以根据操作系统(平台)启用/禁用qss样式表的部分。因此,我可以为MacOS启用一种字体,为Windows启用另一种字体 我可以为特定的小部件设置动态属性 this->setProperty("qsysKernelType", QSysInfo::kernelType()); this->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture()); this->set

是否有一种方法可以根据操作系统(平台)启用/禁用qss样式表的部分。因此,我可以为MacOS启用一种字体,为Windows启用另一种字体

我可以为特定的小部件设置动态属性

this->setProperty("qsysKernelType", QSysInfo::kernelType());
this->setProperty("qsysCurrentCpuArchitecture", QSysInfo::currentCpuArchitecture());
this->setProperty("qsysBuildCpuArchitecture", QSysInfo::buildCpuArchitecture());
this->setProperty("qsysProductType", QSysInfo::productType());

但这只适用于一个小部件,而不适用于整个层次结构。

我不相信有一种标准的简单方法可以做到这一点

但您始终可以将不同平台的CSS资源保存在不同的文件中,并使用ifdef加载它,如:

this->setStyleSheet(QFile(
#ifdef Q_OS_WIN
":/style/win.css"
#else // add more, if you need
":/style/mac.css"
#endif
).readAll());

或者简单地将两个硬编码字符串与ifdef一起使用。

实际上,我们现在使用的是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);
        }
    }
}
void CStyleSheetUtility::setqsysinfo属性(QWidget*widget,bool with childwidgets)
{
Q_ASSERT_X(小部件,Q_FUNC_信息,“缺少小部件”);
如果(!widget->property(“qsysKernelType”).isValid()
{
widget->setProperty(“qsysKernelType”,QSysInfo::kernelType());
widget->setProperty(“qsysCurrentCpuArchitecture”,QSysInfo::currentCpuArchitecture());
widget->setProperty(“qsysBuildCpuArchitecture”,QSysInfo::buildCpuArchitecture());
widget->setProperty(“qsysProductType”,QSysInfo::productType());
}
如果(withChildWidgets)
{
对于(QWidget*w:widget->findChildren(QString(),Qt::FindDirectChildrenOnly))
{
CStyleSheetUtility::setqsysinfo属性(w,true);
}
}
}

我想知道我是否可以/可以将预编译器直接用于我的
.qss
文件。这取决于你的意思。我猜.qss文件的意思是“:/style/win.css”,就像我的例子一样?简单回答-否。您只能将ifdef放入c/c++代码(标题/源代码)中。另一种方法是,您可以创建几个资源文件,并且只包含其中一个在您的.Pro文件中,这取决于平台。并且,如果您想要的只是更改QSS文件的一部分,请考虑将.qs文件拆分为多个。所有平台通用的部分和不同的部分。然后合并cpp中的部分。我也有类似的需求——没有找到更好的。