以下是一个示例代码,实现了这一功能:
from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QStackedWidget, QVBoxLayout
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QTreeWidget with QStackedWidget')
# 创建QTreeWidget
self.tree = QTreeWidget()
self.tree.setHeaderLabels(['Level 1', 'Level 2', 'Level 3'])
self.tree.setColumnCount(3)
root = QTreeWidgetItem(self.tree)
root.setText(0, 'Root')
for i in range(3):
level1_item = QTreeWidgetItem(root)
level1_item.setText(0, 'Level 1 Item {}'.format(i))
for j in range(2):
level2_item = QTreeWidgetItem(level1_item)
level2_item.setText(1, 'Level 2 Item {}'.format(j))
for k in range(4):
level3_item = QTreeWidgetItem(level2_item)
level3_item.setText(2, 'Level 3 Item {}'.format(k))
# 创建QStackedWidget
self.stacked_widgets = []
for i in range(3):
stacked_widget = QStackedWidget()
for j in range(2):
widget = QWidget()
layout = QVBoxLayout()
layout.addWidget(QLabel('Level 2 Item {} - Level 3 Widget {}'.format(j, i)))
widget.setLayout(layout)
stacked_widget.addWidget(widget)
self.stacked_widgets.append(stacked_widget)
# 设置布局
layout = QVBoxLayout()
layout.addWidget(self.tree)
for stacked_widget in self.stacked_widgets:
layout.addWidget(stacked_widget)
self.setLayout(layout)
# 连接信号和槽
self.tree.currentItemChanged.connect(self.switch_stacked_widget)
def switch_stacked_widget(self, current_item, previous_item):
if current_item is None:
return
level1_index = self.tree.indexOfTopLevelItem(current_item.parent())
level2_index = current_item.parent().indexOfChild(current_item)
level3_index = current_item.parent().indexOfChild(current_item)
stacked_widget = self.stacked_widgets[level1_index]
stacked_widget.setCurrentIndex(level2_index)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
在这个例子中,我们创建了一个QTreeWidget
,它有三级节点。每个节点对应一个QStackedWidget
,其中包含了多个QWidget,用于显示不同的内容。当用户点击树的节点时,我们会切换到相应的QStackedWidget
并显示对应的QWidget。
在MainWindow
类的构造函数中,我们首先创建了self.tree
,并添加了一些节点。接着,我们创建了多个QStackedWidget
,并将它们保存在了列表self.stacked_widgets
中。然后,我们设置了整个窗口的布局,将self.tree
和所有的QStackedWidget
都添加进去。最后,我们连接了self.tree
的currentItemChanged
信号和switch_stacked_widget
槽函数。
在switch_stacked_widget
函数中,我们首先获取当前选中的节点的父节点在一级节点中的索引、当前选中的节点在二级节点中的索引和在三级节点中的索引。然后,我们获取对应的QStackedWidget
,并将它的当前QWidget切换到正确的位置。