Qt之容器控件(QStackedWidget)

发布时间 2023-05-23 11:11:23作者: 蝈蝈俊

QStackedWidget提供了一个控件栈,在这个栈中,一次只能显示一个控件。这样我们就可以实现多页面之间的切换。

下面是一个例子:我们将创建3个单独的Python文件,分别表示3个独立的页面。然后,我们使用一个主窗口类来加载并切换这些页面。

首先,创建3个不同的Python文件,每个文件包含一个继承自QWidget的类,这些类分别定义了每个页面的UI和逻辑。

file1.py


# file1.py
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel

class PageOne(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        layout = QVBoxLayout(self)
        layout.addWidget(QLabel("This is page 1"))
        

file2.py


# file2.py
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel

class PageTwo(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        layout = QVBoxLayout(self)
        layout.addWidget(QLabel("This is page 2"))

file3.py

# file3.py
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel

class PageThree(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        layout = QVBoxLayout(self)
        layout.addWidget(QLabel("This is page 3"))

main.py

然后,创建一个主窗口类,该类将使用QStackedWidget来动态加载和切换页面。


# main.py
from PyQt5.QtWidgets import QMainWindow, QPushButton, QVBoxLayout, QWidget, QStackedWidget
from file1 import PageOne
from file2 import PageTwo
from file3 import PageThree

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.stacked_widget = QStackedWidget(self)

        self.page_one = PageOne()
        self.page_two = PageTwo()
        self.page_three = PageThree()

        self.stacked_widget.addWidget(self.page_one)
        self.stacked_widget.addWidget(self.page_two)
        self.stacked_widget.addWidget(self.page_three)

        layout = QVBoxLayout(self)
        layout.addWidget(self.stacked_widget)

        self.button = QPushButton("Next Page")
        self.button.clicked.connect(self.next_page)
        layout.addWidget(self.button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def next_page(self):
        current_index = self.stacked_widget.currentIndex()
        if current_index < self.stacked_widget.count() - 1:
            self.stacked_widget.setCurrentIndex(current_index + 1)
        else:
            self.stacked_widget.setCurrentIndex(0)

if __name__ == '__main__':
    from PyQt5.QtWidgets import QApplication
    import sys

    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())


注意,为了使上述代码能正常工作,你需要确保所有Python文件都在同一目录下,或者在Python的搜索路径中。

运行main.py时,程序将显示PageOne。点击“Next Page”按钮,将在PageOne、PageTwo和PageThree之间进行切换。