pyqt中的多个qml文件

时间:2016-11-07 09:59:57

标签: python qt qml pyqt5

我正在使用pyqt,我有以下目录结构:

root
----> apps/
----> ui/

我在app文件夹中有一个简单的基于qml的应用程序:

应用/ testqt.py

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

app = QApplication(sys.argv)
engine = QQmlApplicationEngine('ui/window.qml')
topLevel = engine.rootObjects()[0]
win = QQuickWindow(topLevel)
win.show()
app.exec_()

UI / window.qml

qml文件定义应用程序窗口并使用StackView,如下所示:

import QtQuick 2.0
import QtQuick.Window 2.1
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4


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

    property Component loginView: LoginView {}

    StackView {
        id: stackView
        anchors.fill: parent
        Component.onCompleted:
        {
            stackView.push(loginView)
        }
    }
}

这使用LoginView组件,该组件定义为:

应用/ LoginView.qml

import QtQuick 2.0
import QtQuick.Window 2.1
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4
import QtQuick.Dialogs 1.0


ControlView {
    ColumnLayout {
        anchors.centerIn: parent
        spacing: 25
        width: 200

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

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

        RowLayout {
            Button {
                id: login_button
                text: "Log In"
                Layout.fillWidth: true
            }

            Button {
                id: cancel_button
                text: "Cancel"
                Layout.fillWidth: true
            }
        }
    }
}

现在当我使用qmlscene时,视图加载就好了。但是,运行python会导致应用程序在尝试加载QQmlApplicationEngine时挂起。我觉得它可能与qml路径有关,所以我将import ../ui包含在window.qml导入中,但这并没有改变任何东西。

我在Anaconda环境中使用Python 2.7Qt 5.6。 Qt是从这里安装的:https://anaconda.org/anaconda/pyqt

1 个答案:

答案 0 :(得分:0)

同样,我使用多个qml文件和多个python文件。当我访问应用程序时,它成功加载了两个qml文件,但是当通过第三个qml页面堆叠时,应用程序崩溃了。它会引发分段错误。

我使用Stackview来推送和弹出QML页面,在调试过程中我发现只有两页的推送和弹出才有效。

如果我也使用Swipeview,我也遇到过。我猜想创建的引擎可以加载两个堆栈QML文件。