可以通过以下步骤将 QTreeWidget 与 QStackedWidget 关联,实现点击树节点切换页面的功能:
创建一个 QTreeWidget 和 QStackedWidget 对象,并将它们添加到窗口中。
将 QTreeWidget 的 itemClicked 信号连接到槽函数,用于处理当用户点击树节点时进行的操作。
在该槽函数中获取所选树节点的索引,然后使用 QStackedWidget 的 setCurrentIndex() 函数将其对应的页面显示出来。
下面是一个简单的示例代码,演示如何实现这个功能:
# 导入必要的模块
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidget, QTreeWidgetItem, QStackedWidget, QPushButton
from PyQt5.QtCore import Qt
# 创建主窗口类
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建 QTreeWidget 和 QStackedWidget
self.tree_widget = QTreeWidget(self)
self.stacked_widget = QStackedWidget(self)
# 添加页面到 QStackedWidget 中
page1 = QPushButton('Page 1', self.stacked_widget)
self.stacked_widget.addWidget(page1)
page2 = QPushButton('Page 2', self.stacked_widget)
self.stacked_widget.addWidget(page2)
page3 = QPushButton('Page 3', self.stacked_widget)
self.stacked_widget.addWidget(page3)
# 添加树节点到 QTreeWidget 中
root = QTreeWidgetItem(self.tree_widget)
root.setText(0, 'Root')
root.setFlags(root.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
for i in range(3):
child = QTreeWidgetItem(root)
child.setText(0, f'Child {i}')
child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
child.setCheckState(0, Qt.Unchecked)
# 将 QTreeWidget 和 QStackedWidget 添加到窗口中
self.tree_widget.setGeometry(0, 0, 200, 400)
self.stacked_widget.setGeometry(200, 0, 400, 400)
self.setCentralWidget(self.stacked_widget)
self.addDockWidget(Qt.LeftDockWidgetArea, self.tree_widget)
# 连接信号和槽函数
self.tree_widget.itemClicked.connect(self.change_page)
# 切换页面的槽函数
def change_page(self, item, column):
index = self.tree_widget.indexOfTopLevelItem(item)
self.stacked_widget.setCurrentIndex(index)
# 创建应用程序对象并运行主循环
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
在上面的示例代码中,我们创建了一个包含三个页面的 QStackedWidget,并将其添加到窗口中。同时,我们使用 QTreeWidget 创建了一个树形结构,其中每个节点代表一个页面。当用户点击树节点时,我们会获取该节点的索引,并使用 QStackedWidget 的 setCurrentIndex() 函数将对应的页面显示出来。
需要注意的是,我们在 QTreeWidgetItem 上设置了 ItemIsUserCheckable 标志以允许用户勾选节点。这是为了避免用户无意中点击节点而触发切换页面的操作。如果您不需要这个功能,可以将其去掉。