PySide2 + QML:QApplication:传递了无效的样式覆盖,忽略它

PySide2 + QML : QApplication: invalid style override passed, ignoring it

我正在使用 QML + PySide / Python 作为后端构建一个简单的应用程序。

我正在尝试使用 "Universal" qml 样式。我正在子类化 QApplication 并添加 -style Universal 参数:

class MyApp(QApplication):

def __init__(self, args):

    qt_args = [args[0], '-style', 'Universal'] + args[1:]
    super(MyApp, self).__init__(qt_args)

它可以工作(我的应用使用通用样式)但它会抛出以下警告:

QApplication: invalid style override passed, ignoring it.
Available styles: windowsvista, Windows, Fusion

PySide2 似乎无法获得标准的 QML 样式(通用/Material)

有人知道怎么处理吗?

谢谢。

解释:

“-style”参数有两个用途:

  • 设置Qt Widgets的样式
  • 设置 Qt Quick Controls 的样式。

因此,由于 QApplication 旨在处理 Qt Widgets,因此首先尝试验证 Qt Widgets 的样式是否存在,但在您的情况下,它通过发出您收到的警告而失败,然后尝试建立 Qt 的样式快速控制。

解决方案:

所以解决方案是找到另一种方法来避免混淆:

  1. Environment variable: 通过QT_QUICK_CONTROLS_STYLE环境变量设置样式:

    import os
    os.environ["QT_QUICK_CONTROLS_STYLE"] = "Universal"
    
  2. Configuration file:

    2.1 创建文件"qtquickcontrols2.conf",内容如下

    ; This file can be edited to change the style of the application
    ; See Styling Qt Quick Controls 2 in the documentation for details:
    ; http://doc.qt.io/qt-5/qtquickcontrols2-styles.html
    
    [Controls]
    Style=Material
    

    2.2 将其添加到 qresource,

    <RCC>
        <qresource prefix="/">
            <file>qtquickcontrols2.conf</file>
        </qresource>
    </RCC>
    

    2.3 使用 pyside2-rcc resource.qrc -o resource_rc.pyrcc --generator python resource.qrc -o resource_rc.py

    将 .qrc 编译为 .py

    2.4 将其导入您的应用程序。

    import resource_rc