Pyqt5 & QML2 部署在 debian/mint (dev - ubuntu)

Posted

技术标签:

【中文标题】Pyqt5 & QML2 部署在 debian/mint (dev - ubuntu)【英文标题】:Pyqt5 & QML2 deploy on 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容器? 是的,就是这个。另外:您是否收到任何错误消息? 没有任何错误信息,只是在启动时冻结。我已经适当地更新了问题。 【参考方案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 项目的任何错误跟踪器,因此它可能会在很长一段时间内未修复,除非开发人员会看到这个答案。

【讨论】:

以上是关于Pyqt5 & QML2 部署在 debian/mint (dev - ubuntu)的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 & PySide2 / 无法在“”中加载 Qt 平台插件“windows”,即使找到了

如何使用 SBT 原生打包器部署 Scala Play 框架 API

在 PyQt5 中获取 GUI 的标准调色板

PyQt5 GUI && Requests Api 做一个天气查询系统(文末领取完整代码)

PyQT5 无法运行 qtdemo.py:ValueError:PyCapsule

如何在 PyQt5 中将字节数组图像添加到 QLabel