gpt4 book ai didi

python - QAbstractTableModel 发出 dataChanged,但从未绘制更新

转载 作者:行者123 更新时间:2023-12-01 08:41:07 29 4
gpt4 key购买 nike

我正在使用 Python 和 PySide2 Qt 绑定(bind)。​​

我的程序旨在从 csv 文件加载记录,将它们显示为表中的行,并在询问时将每条记录上传到远程数据库。每次上传都需要几秒钟,所以我想我应该在上传时更改每行的背景颜色,然后根据成功或失败再次将其更改为红色或绿色。

我有一个TableModel扩展类QAbstractTableModel 。该程序不需要编辑值,只需从 csv 加载它们,因此它不会实现 setData() ,只是data() 。我让它通过了扩展 QSortFilterProxyModel进入QTableView用于排序目的。

class TableModel(QAbstractTableModel):
records = [] #Where the list of records is kept
def data(self, index, role=Qt.DisplayRole):
record = self.records[index.row()]
if role == Qt.DisplayRole:
#bunch of table data stuff
elif role == Qt.BackgroundColorRole:
#This gets called all the time
#but is never called during the uploading process
if record.uploading: return QColor.cyan

def upload(self):
for recordRow in range(len(self.records)):
record = self.records[recordRow]
start = self.createIndex(recordRow, 0)
end = self.createIndex(recordRow, 4)
record.uploading = True
#I've tried both explicitly specifying the desired role
#as well as omitting the argument
self.dataChanged.emit(start, end, [Qt.BackgroundColorRole])
record.upload() #Currently just waits for 1 second
record.uploading = False
self.dataChanged.emit(start, end, [Qt.BackgroundColorRole])

如您所见,我设置了一个上传标志,发出 dataChanged信号,上传(实际上现在只等待 1 秒),关闭标志,并发出 dataChanged再次。我希望看到青色突出显示在每行上停留一秒钟,并在列表中向下移动,但什么也没有发生。

当我监控data()时方法,它永远不会被 BackgroundColorRole 调用在上传迭代期间。

我将一个测试方法连接到 dataChanged信号也是如此,并且它确实以正确的索引发出。

我需要做其他事情来连接 dataChanged适本地?是否 QSortFilterProxyModel我的模型和 View 之间会导致问题吗?

最佳答案

主线程中不应有延迟超过 30 毫秒的任务,因为它会阻塞 GUI,避免执行事件循环,因此信号不会通知,导致 GUI 更新不会发生。因此,您应该在线程上运行它,或者更好地使用 QtNetwork,因为它对 Qt 事件循环很友好。

关于python - QAbstractTableModel 发出 dataChanged,但从未绘制更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490633/

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