Qt如何选择默认样式?

5
在Qt GUI应用程序中,QApplication::style()->objectName()会返回当前样式,例如"windowsvista"。
它是如何选择默认样式的?它使用了哪些信息来做决定?
2个回答

5

Qt自带内置样式,它们是(在我的5.9.2版本中):

  • Windows
  • WindowsXP
  • WindowsVista
  • Android
  • Fusion
  • Macintosh

每个样式都有自己的类,派生自QStyle

要查看可用的样式(这取决于Qt的构建配置):

const auto & styles = QStyleFactory::keys();
for(const auto & s : styles)
{
    qDebug() << s;
}

如果有自定义插件(即QTDIR/plugins/styles目录中的库),如果存在,也会显示出来。

默认样式是如何选择的?

qapplication.cpp文件中,通过搜索QApplication方法style(),按照以下顺序查找默认样式:

  1. 如果由环境变量QT_STYLE_OVERRIDE设置了风格覆盖,则使用该覆盖;
  2. 使用由QApplicationPrivate::desktopStyleKey()返回的样式(此方法从当前平台主题加载样式列表,并从该列表中选择第一个名称存在于QStyleFactory::keys()列表中的名称);
  3. 使用QStyleFactory::keys()列表中的第一项。

如果无法确定样式,则函数将断言。

Q_ASSERT(!"No styles available!");

2
在文档中:
Qt包含一组QStyle子类,模拟Qt支持的不同平台的样式(例如QWindowsStyle、QMacStyle等)。
您可以使用一个键来设置样式:例如windowsvistafusionmacintosh等。当使用任何键时,返回的样式将是QStyle的子类。根据您使用的平台,您将可以访问一定数量的键。
如何/在哪里选择默认样式?
这是在QStyleFactory源代码文件中完成的。您还可以查看QStyle源代码文件,以了解正在发生什么。
它使用哪些信息来决定?
默认样式取决于平台,然后您可以在此平台上选择可用的任何样式键。

默认样式取决于平台。我们在同一台计算机上运行相同的程序,但根据启动方式(直接还是QProcess::startDetached),它选择了不同的样式。 - OJW
@OJW请注意我的答案,环境变量确实会影响默认的样式... - p-a-o-l-o
@p-a-o-l-o 所以答案是 QGuiApplicationPrivate::createPlatformIntegration(),它会选择... - OJW
不,我编辑了我的回答以更好地解释默认样式是在哪里和如何选择的。 - p-a-o-l-o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接