在不同选项卡中显示相同的布局

126 阅读2分钟

1.在 PyQT 中, 有时需要在不同的选项卡中显示相同的布局。例如, 一个应用程序可能有一个选项卡式界面, 其中每个选项卡都包含相同的控件集。然而, 在默认情况下, 当用户切换选项卡时, 控件集不会被复制到新的选项卡。

2、解决方案 有几种方法可以在不同选项卡中显示相同的布局。其中一种方法是创建自定义的 QWidget 子类, 并将该类的实例添加到每个选项卡。自定义小部件类可以定义自己的布局, 该布局可以包含所需的控件。

以下是在 PyQT 中创建自定义小部件类的示例:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

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

        self.layout = QtWidgets.QVBoxLayout()
        self.label = QtWidgets.QLabel("Hello, world!")
        self.button = QtWidgets.QPushButton("Click me!")

        self.layout.addWidget(self.label)
        self.layout.addWidget(self.button)

        self.setLayout(self.layout)

创建自定义小部件类后, 可以将其实例添加到每个选项卡。以下是在 PyQT 中向选项卡式界面添加自定义小部件实例的示例:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

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

        self.tabs = QtWidgets.QTabWidget()
        self.tab1 = QtWidgets.QWidget()
        self.tab2 = QtWidgets.QWidget()

        self.widget1 = CustomWidget()
        self.widget2 = CustomWidget()

        self.tabs.addTab(self.tab1, "Tab 1")
        self.tabs.addTab(self.tab2, "Tab 2")

        self.tab1Layout = QtWidgets.QVBoxLayout()
        self.tab1Layout.addWidget(self.widget1)
        self.tab1.setLayout(self.tab1Layout)

        self.tab2Layout = QtWidgets.QVBoxLayout()
        self.tab2Layout.addWidget(self.widget2)
        self.tab2.setLayout(self.tab2Layout)

        self.setCentralWidget(self.tabs)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

当用户切换选项卡时, 自定义小部件类的实例将在选项卡之间移动。这将确保在每个选项卡中都显示相同的控件集。

另一种在不同选项卡中显示相同布局的方法是使用 QStackedWidget。QStackedWidget 是一个容器小部件, 可以包含多个子小部件, 但一次只能显示一个子小部件。当用户切换选项卡时, QStackedWidget 会将当前显示的子小部件切换为另一个子小部件。

以下是在 PyQT 中使用 QStackedWidget 显示相同布局的示例:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

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

        self.tabs = QtWidgets.QTabWidget()
        self.tab1 = QtWidgets.QWidget()
        self.tab2 = QtWidgets.QWidget()

        self.stackedWidget = QtWidgets.QStackedWidget()

        self.widget1 = CustomWidget()
        self.widget2 = CustomWidget()

        self.stackedWidget.addWidget(self.widget1)
        self.stackedWidget.addWidget(self.widget2)

        self.tabs.addTab(self.tab1, "Tab 1")
        self.tabs.addTab(self.tab2, "Tab 2")

        self.tab1Layout = QtWidgets.QVBoxLayout()
        self.tab1Layout.addWidget(self.stackedWidget)
        self.tab1.setLayout(self.tab1Layout)

        self.tab2Layout = QtWidgets.QVBoxLayout()
        self.tab2Layout.addWidget(self.stackedWidget)
        self.tab2.setLayout(self.tab2Layout)

        self.setCentralWidget(self.tabs)

        self.tabs.currentChanged.connect(self.on_tab_changed)

    def on_tab_changed(self, index):
        self.stackedWidget.setCurrentIndex(index)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

当用户切换选项卡时, QStackedWidget 会自动切换当前显示的子小部件。这将确保在每个选项卡中都显示相同的控件集。