代码之家  ›  专栏  ›  技术社区  ›  Ivan

如何在pyqt5中更改动作触发信号的qtreeview模型?

  •  0
  • Ivan  · 技术社区  · 6 年前

    我正在尝试构建一个Pyqt5应用程序,它将显示一个树视图,并在按下按钮时动态地填充它。但每当我试图从分配给动作触发信号的函数中设置或填充模型时,它就会崩溃(退出代码为134的过程结束(被信号6:sigabrt中断))(尽管如果我实例化模型,加载数据并将模型分配给窗口中的TreeView,它工作正常 __init__ 而不是在分配给信号的函数中)。我怎样才能达到期望的行为?整个模型内容(包括列集)在运行时经常要完全更改。用户界面在qt设计器中设计,并使用pyuic5生成。

    这是我的窗口代码:

    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            #  model = MyModel() #  UPDATE: useless, this wasn't here in the last pre-question version of the code actually
            self.ui.actionLoad.triggered.connect(MainWindow.load) # UPDATE: Here is a mistake - should be self.load, not MainWindow.load
    
        #  @staticmethod #  UPDATE: this wasn't here in the last pre-question version of the code actually
        def load(self):
            model = MyModel()
            self.ui.treeViewLeft.setModel(model)
            self.model.load() # UPDATE: Here is a mistake - should be model.load(), not self.model.load()
    

    这是我的型号代码:

    class MyModel(QStandardItemModel):
        def __init__(self, *args, **kwargs):
            super(MyModel, self).__init__(*args, **kwargs)
    
        def load(self):
            self.clear()
            self.setHorizontalHeaderLabels(["Name", "Attr1", "Attr2"])
            self.appendRow([QStandardItem('item1'), QStandardItem('attr11'), QStandardItem('attr21')])
            self.appendRow([QStandardItem('item2'), QStandardItem('attr12'), QStandardItem('attr22')])
            self.appendRow([QStandardItem('item3'), QStandardItem('attr13'), QStandardItem('attr23')])
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   eyllanesc Yonghwan Shin    6 年前

    在这些情况下,我建议您在命令或终端中执行代码,因为许多IDE在这些情况下都有限制。通过运行它,您会收到以下错误消息:

    Traceback (most recent call last):
      File "main.py", line 29, in load
        self.ui.treeViewLeft.setModel(model)
    AttributeError: 'bool' object has no attribute 'ui'
    Aborted (core dumped)
    

    静态方法指示此方法不属于类的对象,而是属于类本身,如果要修改对象,则它不应是静态方法,因此请删除该修饰器。另一方面,您必须使用self将信号连接到插槽。

    解决方案如下:

    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            model = MyModel()
            self.ui.actionLoad.triggered.connect(self.load)
    
        def load(self):
            model = MyModel(self)
            self.ui.treeViewLeft.setModel(model)
            model.load()