如何更改 PyQt5 中动作触发信号的 QTreeView 模型?
How to change a QTreeView model on an action triggered signal in PyQt5?
我正在尝试构建一个 PyQt5 应用程序,它将显示树视图并在按下按钮时动态填充它。但每当我尝试从分配给动作触发信号的函数中设置或填充模型时,它就会崩溃(进程完成,退出代码 134(被信号 6:SIGABRT 中断))(尽管如果我实例化模型它工作得很好,加载数据并将模型分配给 window __init__
本身的 TreeView,而不是分配给信号的函数)。我如何实现所需的行为?整个模型内容(包括列集)意味着在运行时经常完全改变。 UI在Qt Designer中设计,用pyuic5生成。
这是我的 window 代码:
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')])
在这些情况下,我建议您在 CMD 或终端中执行代码,因为许多 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)
静态方法表示该方法不属于class的对象,属于class本身,如果要修改对象则不能是静态方法所以删除那个装饰器。另一方面,您必须使用 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()
我正在尝试构建一个 PyQt5 应用程序,它将显示树视图并在按下按钮时动态填充它。但每当我尝试从分配给动作触发信号的函数中设置或填充模型时,它就会崩溃(进程完成,退出代码 134(被信号 6:SIGABRT 中断))(尽管如果我实例化模型它工作得很好,加载数据并将模型分配给 window __init__
本身的 TreeView,而不是分配给信号的函数)。我如何实现所需的行为?整个模型内容(包括列集)意味着在运行时经常完全改变。 UI在Qt Designer中设计,用pyuic5生成。
这是我的 window 代码:
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')])
在这些情况下,我建议您在 CMD 或终端中执行代码,因为许多 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)
静态方法表示该方法不属于class的对象,属于class本身,如果要修改对象则不能是静态方法所以删除那个装饰器。另一方面,您必须使用 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()