2014-11-19 1 views
1

У меня есть приложение pyqt5, которое использует qml2 как интерфейс. При переносе с машины разработчика (моей) на другую (mint qiana, debian sid) она запускается при импорте QtQuick.Dialogs 1.1.Pyqt5 & QML2 развертывание на debian/mint (dev - ubuntu)

Ошибка может быть воспроизведена даже на свежих docker контейнерах под управлением debian-sid изображений.

Мой тест питон скрипт:

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 QtQuick.Dialogs 1.1) он работает, но мне нужно FileDialog ..

Версии:

Qt версия: 5.3.2

PyQt версия: 5.3.2

Python версии 3.4: .2

UPD: он работает даже на Mac OS X Yosemite, но не на debian.

+0

Не могу понять второй абзац - можете ли вы прояснить его? – ekhumoro

+0

О контейнерах 'docker'? –

+0

Да, это тот. Также: вы получаете сообщения об ошибках? – ekhumoro

ответ

0

В настоящий момент никакой известной причины такого поведения нет. Я создал bugreport и нашел подходящее решение проблемы. Проблему можно избежать, используя QQmlApplicationEngine вместо QQmlEngine для создания компонентов qml. Кажется QQmlEngine ошибся, потому что эти 2 класса выполняют почти ту же работу.

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

Также я сделал несколько попыток воспроизвести ошибку с кодом C++, но это, кажется, такое поведение плохо реализации PyQt5 только потому, что прекрасно работает с бэкэндом C++.

К сожалению, я не вижу никакого искателя ошибок проекта PyQt, поэтому он может быть незафиксирован в течение длительного времени, если разработчики не увидят этот ответ.