python - QAbstractTableModel 发出 dataChanged,但从未绘制更新
问题描述
我正在使用 Python 和 PySide2 Qt 绑定。
我的程序旨在从 csv 文件加载记录,将它们显示为表格中的行,并在被询问时将每个记录上传到远程数据库。每次上传都需要几秒钟,所以我想我会在上传时更改每行的背景颜色,然后根据成功或失败再次将其更改为红色或绿色。
我有一个TableModel
扩展类QAbstractTableModel
。该程序不需要编辑值,只需从 csv 加载它们,因此它不实现setData()
, 只是data()
. 我已经将它通过扩展QSortFilterProxyModel
进入 aQTableView
用于排序目的。
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
我的模型和视图之间是否会导致问题?
解决方案
您不应该在主线程中有延迟超过 30 毫秒的任务,因为它会阻止 GUI 避免执行事件循环,因此信号不会通知导致 GUI 的更新不会发生。所以你应该在线程上运行它或者更好地使用 QtNetwork,因为它对 Qt 事件循环很友好。
推荐阅读
- asp.net-core-mvc-2.0 - Asp.Net Core 2.2 MVC - 在子文件夹中设置到控制器的默认路由
- formula - 不使用表格计算的 Tableau 运行总计
- c# - 如何将自动生成的 ID 插入外键列
- android - 如何使用 Android 手机摄像头扫描图像(来自 PC 显示器)并将图像数据转换为 OpenCV Mat 格式?
- python-3.x - 在单独的线程中等待而不阻塞主事件循环,异步 python
- excel - 每年、每月和每天计算 GEOMEAN
- ios - iOS 上的 Ionic v4 状态栏文本没有改变
- memory - 获取存储在地址空间中的内存
- javascript - React Native 中的第一个数据中来自 API responseJson 的未定义数据
- swift - iOS Application Support 目录默认存在于设备上