pyqt: невозможно импортировать QtQuick.Dialogs

Я пытался использовать PyQt5, и у меня возникла странная проблема, когда я не могу импортировать QtQuick.Dialogs из приложения Python.

Итак, рассмотрим следующий файл QML:

пример.qml

import QtQuick 2.0
import QtQuick.Window 2.1
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.0 // Offending line!
import DicomSorter 1.0

ApplicationWindow {
    id: rootWindow
    objectName: "window"
    visible: true
    width: 800
    height: 480
    title: "Test"
    Component.onCompleted: {
        setX(Screen.width / 2 - width / 2);
        setY(Screen.height / 2 - height / 2);
    }

    style: ApplicationWindowStyle {
        background: Rectangle {
            color: "#FFFFFF"
        }
    }   

    // Login Form
    Rectangle {
        id: loginForm
        ColumnLayout {
            anchors.centerIn: parent
            spacing: 25
            width: 200

            TextField {
                id: usernameField
                placeholderText: qsTr("User name")
                Layout.fillWidth: true
            }

            TextField {
                id: passwordField
                placeholderText: qsTr("Password")
                Layout.fillWidth: true
                echoMode: TextInput.Password
            }

            RowLayout {
                Button {
                    id: loginButton
                    text: "Log In"
                    Layout.fillWidth: true
                    onClicked: {
                        stackView.push(dirSelector)
                    }
                }

                Button {
                    id: cancelButton
                    text: "Cancel"
                    Layout.fillWidth: true
                }
            }
        }
    } // Login Form    

    // The main stackview component
    StackView {
        id: stackView
        anchors.fill: parent
        Component.onCompleted:
        {
            stackView.push(loginForm)
        }
    } // StackView
}

Теперь я просто вызываю его из своего приложения Python следующим образом:

from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView, QQuickWindow
from PyQt5.QtQml import qmlRegisterType, QQmlApplicationEngine
import sys
import os

app = QApplication(sys.argv)
engine = QQmlApplicationEngine(example.qml')

print "Created"

topLevel = engine.rootObjects()[0]
win = QQuickWindow(topLevel)
win.show()
app.exec_()

Теперь на моем питоне 2.7 с PyQt5.6 это приложение зависает. Однако, если вы закомментируете import QtQuick.Dialogs 1.0, это сработает.


person Luca    schedule 07.11.2016    source источник
comment
Запустите приложение с набором переменных среды QML_IMPORT_TRACE=1 и прикрепите выходные данные.   -  person jpnurmi    schedule 07.11.2016


Ответы (1)


Не уверен, что это поможет. Я не понял, почему я не могу использовать QtQuick Dialogs, но нашел обходной путь: использовать QQmlEngine вместо QQmlApplicationWindow. Итак, я изменил код приложения как:

from PyQt5.QtQml import QQmlEngine, QQmlComponent

app = QApplication(sys.argv)
engine = QQmlEngine(app)
component = QQmlComponent(engine)
component.loadUrl(QUrl('ui/window.qml'))
top = component.create()
top.show()
app.exec_()
person Luca    schedule 07.11.2016