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 会自动切换当前显示的子小部件。这将确保在每个选项卡中都显示相同的控件集。