首页 > 解决方案 > 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我的模型和视图之间是否会导致问题?

标签: pythonpyside2qabstracttablemodel

解决方案


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


推荐阅读