在您的代码中,您已经创建了一个树形菜单类 QTreewindows 和一个堆栈页面类 QStackedwindows。为了使它们以类对象的形式连接起来并实现堆栈窗口控件的页面切换,您需要确保这两个类之间能够相互访问和通信。
这里有几个关键点需要注意:
QTreewindows 类中的 Click 方法被设计为响应树形菜单中项目的点击事件。在这个方法中,您已经检查当前点击的项目文本是否为“柴油”,并尝试显示不同的堆栈页面。但是,QStackedwindows().display(1) 这行代码创建了一个新的 QStackedwindows 对象,而不是使用现有的对象。
您需要有一种方式让 QTreewindows 访问到 QStackedwindows 的实例。这通常可以通过将 QStackedwindows 的实例作为参数传递给 QTreewindows 的构造函数,或者通过某种形式的单例模式来实现。
另一个问题是,您应该在 QStackedwindows 的 display 方法中处理页面的切换,而不是在 QTreewindows 的 Click 方法中直接创建新的 QStackedwindows 实例。
下面是一个修改后的示例,展示如何将这两个类以类对象的形式连接起来:
from PyQt5.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem, QStackedWidget, QMainWindow
class QStackedwindows(QStackedWidget):
def __init__(self):
super().__init__()
self.addWidget(QTablewindows1()) # 假设QTablewindows1和QTablewindows2是有效的QWidget子类
self.addWidget(QTablewindows2())
class QTreewindows(QTreeWidget):
def __init__(self, stacked_widget):
super().__init__()
self.setHeaderHidden(True)
self.setColumnCount(1)
self.ROOT()
self.expandAll()
self.clicked.connect(self.Click)
self.stacked_widget = stacked_widget # 存储堆栈窗口的引用
def ROOT(self):
# 假设这里填充树形菜单
pass
def Click(self):
print(self.currentItem().text(0))
if self.currentItem().text(0) == '柴油':
self.stacked_widget.display(1) # 使用已存储的堆栈窗口引用
return
else:
print('666')
class QTablewindows1(QWidget): # 假设QTablewindows1和QTablewindows2是有效的QWidget子类
def __init__(self):
super().__init__()
# 初始化窗口1的内容
class QTablewindows2(QWidget):
def __init__(self):
super().__init__()
# 初始化窗口2的内容
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.stacked_widget = QStackedwindows()
self.tree_widget = QTreewindows(self.stacked_widget)
self.setCentralWidget(self.tree_widget)
self.setCentralWidget(self.stacked_widget) # 设置堆栈窗口为中央部件
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
在上面的代码中,MainWindow 类创建了一个 QStackedwindows 对象和一个 QTreewindows 对象,并将 QStackedwindows 的实例传递给 QTreewindows 的构造函数。这样,QTreewindows 就可以通过其 stacked_widget 属性访问到 QStackedwindows 的实例,并在点击事件中调用其 display 方法来切换页面。
请注意,这个示例假设 QTablewindows1 和 QTablewindows2 是有效的 QWidget 子类,并且它们已经定义好了。您需要确保这些类已经存在并且可以被正确导入。
此外,ROOT 方法在这里没有实现,您需要根据您的具体需求来填充树形菜单。