qq_35996879 2021-01-27 14:50 采纳率: 0%
浏览 13

PTQT5堆栈窗口控件与树形视图如何以类对象的形式连接起来并实现堆栈窗口控件页面切换

这是树形菜单
class QTreewindows(QTreeWidget):
    def __init__(self):
        super().__init__()
        self.setHeaderHidden(True)
        self.setColumnCount(1)
        self.ROOT()
        # 子目录()
        self.expandAll()
        self.clicked.connect(self.Click)

    def Click(self):
        print(self.currentItem().text(0))
        if self.currentItem().text(0)=='柴油':
            QStackedwindows().display(1)
            return 1
        else:
            print('666')
这是堆栈页面
class QStackedwindows(QStackedWidget):
    def __init__(self):
        super().__init__()
        self.addWidget(QTablewindows1())
        self.addWidget(QTablewindows2())

    def display(self,index):
        self.setCurrentIndex(index)

我试过如果用QStackedLayout的话,堆栈是可以触发弹窗,但是没法做到切换页面。

求大神指点一下

  • 写回答

1条回答 默认 最新

  • 禾戊之昂 新星创作者: python技术领域 2024-04-07 11:09
    关注

    在您的代码中,您已经创建了一个树形菜单类 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 方法在这里没有实现,您需要根据您的具体需求来填充树形菜单。

    评论

报告相同问题?