QAbstractTableModel испускает dataChanged, но обновление не выполняется - PullRequest
0 голосов
/ 27 ноября 2018

Я использую привязки 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 между моей моделью и видом проблемы?

1 Ответ

0 голосов
/ 27 ноября 2018

У вас не должно быть задач, которые задерживают более 30 мс в главном потоке, так как он блокирует графический интерфейс пользователя, избегая того, чтобы цикл обработки событий выполнялся, и, следовательно, сигналы не уведомляют, в результате чего обновления GUI не происходят.Поэтому вы должны запустить его в потоке или лучше использовать QtNetwork, потому что он дружелюбен к циклу событий Qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...