【问题标题】:Using QStackedWidget for multi-windowed PyQt application将 QStackedWidget 用于多窗口 PyQt 应用程序
【发布时间】:2018-01-19 07:19:50
【问题描述】:

我有一个多窗口 PyQt5(Python 3.6.2 和 Qt 5.9.0)应用程序,在标准桌面(即窗口管理)环境中运行时可以完美运行。我的目标平台是嵌入式设备(例如 Raspberry Pi、i.MX6 等),我不会在其中使用 X11 窗口系统。我目前正在使用不支持多个窗口的 eglfs 平台测试嵌入式设备。我正在考虑使用 QtWayland 平台,或者修改我的方法以使用 QtStackedWidget 将“窗口”作为单独的页面包含在堆栈中。

如何修改以下高级窗口应用程序以利用 QStackedWidget 排列,以促进无窗口环境中的多页应用程序?

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow

from ui_Main import Ui_Main
from ui_Window1 import Ui_Window1
from ui_Window2 import Ui_Window2

class Main(QMainWindow, Ui_Main):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)

        #Initialisation functions

        self.PushButton1.clicked.connect(self.OpenWindow1)
        self.PushButton2.clicked.connect(self.OpenWindow2)

    def OpenWindow1(self):
        showWindow1.show()

    def OpenWindow2(self):
        showWindow2.show()

class Window1(QMainWindow, Ui_Window1):
    def __init__(self, parent=None):
        super(Window1, self).__init__(parent)
        self.setupUi(self)

class Window2(QMainWindow, Ui_Window2):
    def __init__(self, parent=None):
        super(Window2, self).__init__(parent)
        self.setupUi(self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    showMain = Main()
    showWindow1 = Window1()
    showWindow2 = Window2()
    showMain.show()

    app.exec_()

【问题讨论】:

  • 不熟悉eglfs平台,但是QStackedWidget并不是特别难用。您是否尝试过仅使用它?这一切都取决于您到底想要实现什么,但总的来说应该是可行的。您应该指定多页应用程序的含义。在单个窗口中实现多页应用程序的一种方法是使用 QWizard。
  • 我不知道 QWizard,所以感谢您指出这一点。我发布的示例代码代表了我正在尝试实现的基本多页面配置,其中您有一个在应用程序启动时显示的主页,以及多个导入的外部 .py 文件,这些文件显示在主页面的顶部窗户。我希望仍然能够导入这些外部 .py 文件,但将它们嵌套在主窗口中。
  • 我对此进行了更多思考,并以上述示例代码为例。我想我需要创建一个 ui_Main.py 文件,其中包含所有“windows”的所有 setupUi,然后有一个类 Main()。

标签: python qt pyqt pyqt5 qstackedwidget


【解决方案1】:

我使用 QStackedLayout 将每个“窗口”嵌套在一个页面中,然后将外部 .py 文件的每个 setupUI() 函数合并到一个外部文件中。以下文件反映了这种方法,使用了我的问题中发布的示例多窗口示例。

ui_Main.py:

from PyQt5 import QtCore, QtGui, QtWidgets

import sys

class Ui_Main(QtWidgets.QWidget):
    def setupUi(self, Main):
        Main.setObjectName("Main")
        Main.resize(800, 480)

        self.QtStack = QtWidgets.QStackedLayout()

        self.stack1 = QtWidgets.QWidget()
        self.stack2 = QtWidgets.QWidget()
        self.stack3 = QtWidgets.QWidget()

        self.Window1UI()
        self.Window2UI()
        self.Window3UI()

        self.QtStack.addWidget(self.stack1)
        self.QtStack.addWidget(self.stack2)
        self.QtStack.addWidget(self.stack3)

    def Window1UI(self):
        self.stack1.resize(800, 480)

        #PushButton1#
        self.PushButton1 = QtWidgets.QPushButton(self.stack1)
        self.PushButton1.setText("BUTTON 1")
        self.PushButton1.setGeometry(QtCore.QRect(10, 10, 100, 100))

        #PushButton2#
        self.PushButton2 = QtWidgets.QPushButton(self.stack1)
        self.PushButton2.setText("BUTTON 2")
        self.PushButton2.setGeometry(QtCore.QRect(150, 150, 100, 100))

    def Window2UI(self):
        self.stack2.resize(800, 480)
        self.stack2.setStyleSheet("background: red")

    def Window3UI(self):
        self.stack3.resize(800, 480)
        self.stack3.setStyleSheet("background: blue")

Main.py:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow

import sys

from ui_Main import Ui_Main

class Main(QMainWindow, Ui_Main):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)

        self.PushButton1.clicked.connect(self.OpenWindow1)
        self.PushButton2.clicked.connect(self.OpenWindow2)

    def OpenWindow1(self):
        self.QtStack.setCurrentIndex(1)

    def OpenWindow2(self):
        self.QtStack.setCurrentIndex(2)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    showMain = Main()
    sys.exit(app.exec_())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多