gpt4 book ai didi

python - 为什么在使用 QSortFilterProxyModel 时 layoutChanged.emit() 不更新 QListView?

转载 作者:行者123 更新时间:2023-12-04 09:35:51 26 4
gpt4 key购买 nike

我无法让 QListView 使用代理模型。
我开始将 QListViews 与模型一起使用,没有任何问题,并在运行时使用该模型的 datachanged.emit() 信号更改数据。
但是,当我尝试更改基于代理模型的 QListView 中的数据时,该数据不会在界面中更新。
我把它归结为一个最小的例子,但仍然看不到这种行为的根本原因:

from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QApplication, QListView)
from PyQt5 import QtCore


# model for QListView
class ListModel(QtCore.QAbstractListModel):
def __init__(self, items):
super().__init__()
self.items = items

def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
return self.items[index.row()]

def rowCount(self, index):
return len(self.items)


class MainWindow(QWidget):
def __init__(self):
super().__init__()
# creating list with "standard" model and an initial dataset => this works
list_view_1 = QListView()
list_view_1.setModel(ListModel(['original', 'model']))

# creating list with proxy based on source model and an initial dataset => this works
list_view_2 = QListView()
proxy = QtCore.QSortFilterProxyModel()
proxy.setSourceModel(ListModel(['original', 'proxy+model']))
list_view_2.setModel(proxy)

# changing data in model and emitting layout change => this works
list_view_1.model().items = ['changed', 'model']
list_view_1.model().layoutChanged.emit()

# changing data in proxy and emitting layout change => this does not work?
list_view_2.model().items = ['changed', 'proxy+model']
list_view_2.model().layoutChanged.emit()

# adding layout to the interface
hbox = QHBoxLayout()
hbox.addWidget(list_view_1)
hbox.addWidget(list_view_2)

self.setLayout(hbox)
self.show()


app = QApplication([])
window = MainWindow()
app.exec_()
我的搜索都没有解释这种行为, a related stack thread只提到了模型的顺序,我已经以这种方式实现了。
谁能指出我如何正确更新“代理模型”中的数据的解决方案?

最佳答案

问题是您在代理模型中创建属性(项)而不是更新源模型项,解决方案是更新源模型项:

# ...
# changing data in model and emitting layout change => this works
list_view_1.model().items = ["changed", "model"]
list_view_1.model().layoutChanged.emit()

# changing data in proxy and emitting layout change => this does not work?
list_view_2.model().sourceModel().items = ["changed", "proxy+model"]
list_view_2.model().layoutChanged.emit()
# ...

关于python - 为什么在使用 QSortFilterProxyModel 时 layoutChanged.emit() 不更新 QListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62592340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com