【问题标题】:Cannot use ApplicationWindow (QML) on PySide2无法在 PySide2 上使用 ApplicationWindow (QML)
【发布时间】:2019-02-14 22:00:56
【问题描述】:

我正在尝试使用 QML 尤其是 ApplicationWindow 运行一个简单的 Qt 应用程序。

我的 Python 代码是一个简单的 QML 调用程序:

import sys
from PySide2.QtWidgets import QApplication
from PySide2.QtQuick import QQuickView
from PySide2.QtCore import QUrl

if __name__ == '__main__':

    app = QApplication(sys.argv)

    view = QQuickView()
    url = QUrl('view.qml')
    view.setSource(url)
    view.show()

    sys.exit(app.exec_())

我的 QML 文件是一个简单的 ApplicationWindow,带有标题、宽度和高度:

import QtQuick 2.0

ApplicationWindow {

    title: "Qt Quick Controls Gallery"

    width: 640
    height: 480
}

运行代码会导致一个空白屏幕,具有默认标题(“gui.py”,而不是 QML 中给出的标题),以及默认宽度和高度(不是 QML 文件中指定的):

我可以毫无问题地运行其他组件,例如矩形、按钮和画布。我的问题特别在于 ApplicationWindow 组件,我想使用它,因为它是 QML 应用程序的标准。

我正在尝试坚持使用 PySide2,因为它正在成为 Python Qt 的支持,但我当然也接受 PyQt 解决方案。

【问题讨论】:

    标签: python qml pyside2


    【解决方案1】:

    如果您阅读docs

    QQuickView 类提供了一个用于显示 Qt Quick 用户界面的窗口。

    也就是说,QQuickView 提供了一个窗口来显示项目,但ApplicationWindow 已经是一个窗口,所以你不需要也不应该再使用QQuickView,对于ApplicationWindow,你必须使用@987654327 @:

    ma​​in.py

    import sys
    from PySide2 import QtCore, QtGui, QtQml
    
    if __name__ == '__main__':
    
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        app = QtGui.QGuiApplication(sys.argv)
    
        engine = QtQml.QQmlApplicationEngine()
    
        url = QtCore.QUrl.fromLocalFile('view.qml')
        engine.load(url)
        if not engine.rootObjects():
            sys.exit(-1)
    
        sys.exit(app.exec_())
    

    view.qml

    import QtQuick 2.7
    import QtQuick.Controls 2.4
    
    ApplicationWindow {
        title: "Qt Quick Controls Gallery"
        width: 640
        height: 480
        visible: true // <---
    }
    

    【讨论】:

      【解决方案2】:

      首先,作为 pyside 返回:

      QQuickView 不支持使用 windows 作为根项目。如果你希望 要从 QML 创建根窗口,请考虑使用 QQmlApplicationEngine 代替。

      这是一个工作示例:

      main.py

      import sys
      from PySide2.QtWidgets import QApplication
      from PySide2.QtCore import Qt, QCoreApplication
      from PySide2.QtQml import QQmlApplicationEngine
      
      if __name__ == '__main__':
      
          app = QApplication(sys.argv)
      
          QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
          QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
      
          engine = QQmlApplicationEngine('view.qml')
      
          sys.exit(app.exec_())
      

      view.qml

      import QtQuick.Controls 2.4
      import QtQuick 2.0
      
      ApplicationWindow {
      
          title: "Qt Quick Controls Gallery"
          visible: true
          width: 640
          height: 480
          Rectangle {
              width: 30
              height: 30
              color: "blue"
          }
      }
      

      【讨论】:

      • 你说:ApplicationWindow是在QtQuick.Controls 2.4中定义的,既然不是这样,Qt Quick Controls I和II中有ApplicationWindow。doc.qt.io/qt-5/qml-qtquick-controls-applicationwindow.html和@987654322 @
      • 注意:在 QtQuick.Controls 2.4 中没有定义 ApplicationWindow,只是在 QtQuick.Controls 中定义。然而,Python 代码运行良好。
      猜你喜欢
      • 2019-08-04
      • 1970-01-01
      • 2019-08-26
      • 2021-03-10
      • 2017-05-28
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多