pyqt中的多个qml文件

Posted

技术标签:

【中文标题】pyqt中的多个qml文件【英文标题】:multiple qml files in pyqt 【发布时间】:2016-11-07 09:59:56 【问题描述】:

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

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

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

apps/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 组件,它被定义为:

apps/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

【问题讨论】:

我意识到这不是多 QML 文件问题,但不知何故 PyQt 5.6 不允许我导入 QtQuick.Dialogs。我在这里创建了一个后续问题:***.com/questions/40467572/… 一个问题是:为什么要创建第二个窗口? @KevinKrammer 第二个窗口?对话框导入是因为我想在某个时候使用 FileDialog 组件。 win = QQuickWindow(topLevel) 行创建了一个“QQuickWindow”,QML 已经创建了一个窗口作为其顶层。所以我想知道你为什么要在 Python 中创建另一个窗口。对我来说似乎是不必要的复杂性。 【参考方案1】:

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

我使用 Stackview 推送和弹出 QML 页面,在调试过程中我发现它只在两个页面完成推送和弹出时有效。

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

【讨论】:

以上是关于pyqt中的多个qml文件的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 和 QML:如何在一个插槽或函数中处理多个信号

使用 PyInstaller 在 --onefile 中使用 QML 构建 PyQt5

pyqt5 孩子使用 qml 文件访问

PyQt5 与 QML

在PyQt中创建MapQuickItem并将其添加到Map中

使用 PyQt 将基于 qml 的图表集成到现有的 ui