QAbstractTableModel 发出 dataChanged,但从不绘制更新
QAbstractTableModel emits dataChanged, but update is never drawn
我正在使用 Python 和 PySide2 Qt 绑定。
我的程序旨在从 csv 文件加载记录,将它们显示为 table 中的行,并在询问时将每个记录上传到远程数据库。每次上传都需要几秒钟,所以我想我会在上传时更改每一行的背景颜色,然后根据成功或失败再次将其更改为红色或绿色。
我有一个扩展 QAbstractTableModel
的 TableModel
class。该程序不需要编辑值,只需从 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
是否会导致问题?
您不应在主线程中拥有延迟超过 30 毫秒的任务,因为它会阻止 GUI 避免执行事件循环,因此信号不会通知导致 GUI 的更新不会发生。所以你应该 运行 它在一个线程上或者更好地使用 QtNetwork 因为它对 Qt 事件循环很友好。
我正在使用 Python 和 PySide2 Qt 绑定。
我的程序旨在从 csv 文件加载记录,将它们显示为 table 中的行,并在询问时将每个记录上传到远程数据库。每次上传都需要几秒钟,所以我想我会在上传时更改每一行的背景颜色,然后根据成功或失败再次将其更改为红色或绿色。
我有一个扩展 QAbstractTableModel
的 TableModel
class。该程序不需要编辑值,只需从 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
是否会导致问题?
您不应在主线程中拥有延迟超过 30 毫秒的任务,因为它会阻止 GUI 避免执行事件循环,因此信号不会通知导致 GUI 的更新不会发生。所以你应该 运行 它在一个线程上或者更好地使用 QtNetwork 因为它对 Qt 事件循环很友好。