Я использую привязки Python и QS PySide2.
Моя программа предназначена для загрузки записей из файла 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
между моей моделью и видом проблемы?