Отображение огромного листа с помощью QTableWidget

Мне нужно отобразить данные, используя класс PyQt QTableWidget. Но там могут быть десятки тысяч строк. Отображение всего листа заставляет приложение зависать...

Итак, я нашел решение, состоящее в загрузке данных (имеется в виду, что лист создан), но сокрытии большинства строк и при перемещении полосы прокрутки, показывая новые строки и скрывая предыдущие.

В приведенном ниже коде я установил self.rowsShown = 50, и при инициализации отображаются строки с 1 по 50. А раньше я делал self.verticalScrollBar().actionTriggered.connect(self.refreshDisplay).

Итак, код:

def refreshDisplay(self):
    """
    This is to refresh the display when the scrollbar is moved
    """

    # Minimum is reached and a previous row exists
    if self.verticalScrollBar().value() <= self.verticalScrollBar().minimum() and self.isRowHidden(self.firstRowShown-1):# Minimum is reached and a previous row exists
        for row in xrange(self.lastRowShown-1, self.lastRowShown):
            self.hideRow(row)
            self.lastRowShown -= 1
        for row in xrange(self.firstRowShown-1, self.firstRowShown):
            self.showRow(row)
            self.firstRowShown -= 1
    # Maximum is reached and a next row exists
    if self.verticalScrollBar().value() >= self.verticalScrollBar().maximum() and self.isRowHidden(self.lastRowShown+1):
        for row in xrange(self.firstRowShown, self.firstRowShown+1):
            self.hideRow(row)
            self.firstRowShown += 1
        for row in xrange(self.lastRowShown, self.lastRowShown+1):
            self.showRow(row)
            self.lastRowShown += 1

Это работает очень хорошо, когда я использую поворот мыши или нажимаю кнопки полосы прокрутки. Но когда я хватаю ползунок или использую клавиатуру для перемещения выбранного регистра, я заблокирован в показанной области.

При этом размер области прокрутки соответствует только отображаемым строкам. Я хотел бы переопределить его, чтобы установить свою собственную полосу (например, с размером, основанным на реальном количестве строк), чтобы я мог быстро перемещаться в другую часть листа. Но размер полосы прокрутки всегда обновляется с количеством отображаемых строк.

Итак, я ожидаю от вас помочь мне решить эти две проблемы ИЛИ дать мне другую идею для отображения такого огромного листа. Возможно, я пропустил модуль или класс, которые уже имеют эту функциональность загрузки/отображения строк при перемещении курсора.

Спасибо


person VGO    schedule 23.08.2012    source источник
comment
Пробовали ли вы QTableView?   -  person alex vasi    schedule 23.08.2012
comment
QTableWidget наследуется от QTableView. Итак, функции hideRow() и showRow(), которые я здесь использовал, взяты из QTableView.   -  person VGO    schedule 23.08.2012


Ответы (1)


Я написал инструмент, который отображает 10 ^ 6+ строк в таблице, подобной Excel, без проблем с ресурсами. Решение состоит в том, чтобы использовать QTableView и QAbstractTableModel. Вы должны получить от QAbstractTableModel и реализовать необходимые функции, которые он требует от вас реализовать (я помню headerData и data, но я думаю, что есть и другие). Затем вы подключаете модель к своему представлению, выполняя view.setModel(model). Дополнительную информацию о том, как это сделать, можно найти здесь.

person hochl    schedule 23.08.2012