【问题标题】:Pyqt5 & QML2 deploy on debian/mint (dev - ubuntu)Pyqt5 & QML2 部署在 debian/mint (dev - ubuntu)
【发布时间】:2014-11-19 14:09:41
【问题描述】:

我有 pyqt5 应用程序,它使用 qml2 作为前端。在从开发人员(我的)机器迁移到另一台(mint qiana、debian sid)时,它坚持导入QtQuick.Dialogs 1.1

即使在运行 debian-sid 图像的新 docker 容器上也可以重现错误。

我的测试python脚本:

from PyQt5 import QtWidgets, QtWidgets, QtCore, uic
from PyQt5.QtCore import pyqtProperty, QCoreApplication, QObject, QUrl
from PyQt5.QtQml import qmlRegisterType, QQmlComponent, QQmlEngine


class CommonQMLWindow():

    def __init__(self, qml_file_name):
        self._engine = QQmlEngine()
        component = QQmlComponent(self._engine)

        # STUCK HERE (LINE BELOW - component.loadUrl)
        component.loadUrl(QUrl(qml_file_name))
        self.qml_window = component.create()

        if self.qml_window is None:
            for error in component.errors():
                print(error.toString())

            exit(1)

from ui import commonqmlwindow

加载中:

from PyQt5 import QtWidgets, QtWidgets, QtCore, uic
from PyQt5.QtCore import pyqtProperty, QCoreApplication, QObject, QUrl
from PyQt5.QtQml import qmlRegisterType, QQmlComponent, QQmlEngine


class MainWindow(commonqmlwindow.CommonQMLWindow):
    def __init__(self, parent=None):

        commonqmlwindow.CommonQMLWindow.__init__(self, 'ui/test.qml')

qml 文件:

import QtQuick 2.0
import QtQuick.Dialogs 1.1
import QtGraphicalEffects 1.0
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.2

import "." as Controls
import "../uihelpers.js" as UIHelpers


TextField {
    id: rootItem

    property bool pickDirectory: false
    property alias pickerTitle: picker.title
    property alias pickerSelectMask: picker.nameFilters
    property alias selectedUrl: picker.fileUrl


    readOnly: true

    FileDialog {
        id: picker

        selectFolder: rootItem.pickDirectory ? true : false
    }
}

main.py:

app = QtWidgets.QApplication(sys.argv)
main_window = mainwindow.MainWindow()
app.exec()

所有软件包都已安装(对于 qml2、python3、pyqt5 和 qt5)适用于除此之外的任何东西。

这种行为发生在Linux Mint qianaDebian sid。当我评论 import statment (//import QtQuick.Dialogs 1.1) 时它可以工作,但我需要 FileDialog..

版本:

Qt 版本:5.3.2

PyQt 版本:5.3.2

Python 版本:3.4.2

UPD:它甚至适用于 Mac OS X Yosemite,但不适用于 debian。

【问题讨论】:

  • 无法理解第二段 - 你能澄清一下吗?
  • 关于docker容器?
  • 是的,就是这个。另外:您是否收到任何错误消息?
  • 没有任何错误信息,只是在启动时冻结。我已经适当地更新了问题。

标签: qt dialog pyqt qml freeze


【解决方案1】:

目前尚无任何已知原因导致此行为。我创建了一个bugreport 并找到了解决问题的方法。这个问题可以通过使用QQmlApplicationEngine 而不是QQmlEngine 创建qml 组件来避免。 QQmlEngine 似乎有问题,因为这两个类的工作几乎相同。

from PyQt5 import QtQml
engine = QtQml.QQmlApplicationEngine()
engine.load(QtCore.QUrl('test.qml'))
sys.exit(app.exec())

我还尝试使用 C++ 代码重现错误,但似乎这种行为对 PyQt5 的实现不利,只是因为它适用于 C++ 后端。

不幸的是,我看不到 PyQt 项目的任何错误跟踪器,因此它可能会在很长一段时间内未修复,除非开发人员会看到这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2022-07-09
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多