Python 和 QML 上的多页

Posted

技术标签:

【中文标题】Python 和 QML 上的多页【英文标题】:Multiple Page on Python and QML 【发布时间】:2017-08-21 21:41:19 【问题描述】:

我是 python 和 qml 编程的初学者,我正在做一个项目 我的项目需要有很多 UI 表单我正在使用 qml 来创建这些 UI

假设我们有表格 A、B、C,当应用程序加载时,我需要它来打开表格 A,表格 A 包含我单击并打开表格 B 和表格 A 的按钮,表格 B 它有我单击它的按钮打开表格 C 和表格 B 关闭...请帮助我完成这些项目

ma​​in.py

import sys
from PyQt5.QtCore import QObject, QUrl, Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine

if __name__ == "__main__":
    app = QApplication(sys.argv)
    engine = QQmlApplicationEngine()
    ctx = engine.rootContext()
    ctx.setContextProperty("main", engine)


    ctx2 = engine.rootContext()
    ctx2.setContextProperty("main", engine)


    engine.load('form1.qml')
    win = engine.rootObjects()[0]
    def pageC():
        engine.load('form3.qml')
        win2 = engine.rootObjects()[0]
        button1 = win2.findChild(QObject, "form3")
        button1.clicked.connect(pageC)
        win2.show()

    def newPage():
        engine.load('form2.qml')
        win = engine.rootObjects()[0]
        win.show()




    button1=win.findChild(QObject, "form2")
    button1.clicked.connect(newPage)

win.show()
sys.exit(app.exec_())

form1.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.5

Window 
    visible: true
    width: 200
    height: 200
    title: qsTr("Hello World")
    maximumHeight: 200
    minimumHeight: 200
    maximumWidth: 200
    minimumWidth: 200


    Button 
        id: button1
        objectName: "form2"
        x: 22
        y: 71
        width: 157
        height: 59
        text: qsTr("Page a")
        onClicked: callPageB()
    

form2.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.5

Window 
    visible: true
    width: 200
    height: 200
    title: qsTr("Hello World")
    maximumHeight: 200
    minimumHeight: 200
    maximumWidth: 200
    minimumWidth: 200


    Button 
        id: button1
        objectName: "form3"
        x: 22
        y: 71
        width: 157
        height: 59
        text: qsTr("Page B")
        onClicked: callPageC()
    

form3.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.5

Window 
    visible: true
    width: 200
    height: 200
    title: qsTr("Hello World")
    maximumHeight: 200
    minimumHeight: 200
    maximumWidth: 200
    minimumWidth: 200


    Button 
        id: button1
        x: 22
        y: 71
        width: 157
        height: 59
        text: qsTr("Page C")
    

【问题讨论】:

你想让我对上一个窗口做什么?要关闭它吗? 是的,我想关闭 【参考方案1】:

将qmls添加到QQmlApplicationEngine我们可以通过rootObjects(),所以我只是创建了以下类,但是有一定的限制,Window内的每个按钮都应该有objectName作为名称该文件并且必须是 Window 的子项:

example.qml:

Window 
    ...
    Button 
        objectName: "example"
    
    ...

在下一部分这个类与你的 qmls 的名称。

class Engine(QQmlApplicationEngine):
    counter = 0
    def __init__(self, qmls, parent=None):
        QQmlApplicationEngine.__init__(self, parent)

        [self.load(".qml".format(qml)) for qml in qmls]

        for i, root in enumerate(self.rootObjects()):
            if root != self.rootObjects()[0]:
                root.close()
            if root != self.rootObjects()[-1]:
                button= root.findChild(QObject, qmls[i])
                button.clicked.connect(self.closeAndOpen)

    def closeAndOpen(self):
        self.rootObjects()[self.counter].close()
        self.counter += 1
        self.rootObjects()[self.counter].show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    engine = Engine(['form1', 'form2', 'form3'])
    sys.exit(app.exec_())

【讨论】:

我有另一个问题我创建了登录页面,当用户登录遇到具有下一个表单按钮的仪表板时启动,但是当我添加这些解决方案时它可以正常工作但是当我单击按钮时调用openCv相机它不起作用你能帮我解决这个问题吗..

以上是关于Python 和 QML 上的多页的主要内容,如果未能解决你的问题,请参考以下文章

Python上的多线程websocket服务器

如何提交包含带有输入元素的多页表的表单

react-router-dom 中的多页路由问题

Python Web-scraping多页表到csv和DF进行分析

Qt5 / PyQt5 : 带有 QML 前端和 Python 后端的自定义 QML 组件

基于微前端qiankun的多页签缓存方案实践