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 qiana
、Debian 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 && Requests Api 做一个天气查询系统(文末领取完整代码)