Виджет Qt для отображения большого количества строк данных

Я пытаюсь отобразить большое количество столбцовых записей в прокручиваемом представлении, используя Qt (5.1).

Количество строк, которые я хотел бы просматривать, может варьироваться, скажем, от 100 миллионов до 1 миллиарда.

QTableWidget с пользовательской моделью работает с несколькими миллионами строк, но QTableWidget выделяет данные для каждой строки, потому что вы можете изменить размер строки, и поэтому он должен хранить данные для этого, что может использовать мегабайты или даже гигабайты памяти с 100M ряды.

Мне не нужна функциональность строк с изменяемым размером, просто список из нескольких столбцов был бы идеальным, но QTreeCtrl, похоже, не работает со многими строками, а QList, похоже, поддерживает только одиночные столбцы.

Должен ли я для этой цели реализовать собственный виджет из QAbstractItemView?

Для тех, кто знаком с wxwidgets/wepython, это можно сделать так, и он хорошо работает с миллиардами строк:

import wx

class VirtualList(wx.ListCtrl):

    def __init__(self, parent, id, pos, size, flags):
        wx.ListCtrl.__init__(self, parent, id, pos, size, flags)

    def OnGetItemText(self, item, column):
        return "Row %d, Column %d" % (item, column)

person Spacen Jasset    schedule 16.01.2014    source источник
comment
Вам не нужно выделять сразу все 100 миллионов или миллиард строк, выделять 100 или 200, а когда пользователь прокручивает до конца выделенных 100 или 200 записей, выделять новые записи и освобождать те, которые находятся далеко от активных строк. , которые просматриваются прямо сейчас   -  person Shf    schedule 16.01.2014
comment
Существует QTreeView, который может обрабатывать многострочное отображение и работать быстрее, чем QTableView. У него есть свойство uniformRowHeights, которое определяет, имеют ли все элементы в древовидном представлении одинаковую высоту, что позволяет выполнять некоторую оптимизацию представления. Также разрешено загружать фрагменты данных. Не все данные сразу.   -  person Pie_Jesu    schedule 16.01.2014
comment
Можете ли вы описать вариант использования, в котором пользователь может просматривать (и действительно должен просматривать) 1 миллиард строк за один раз? Вы должны подумать о выборке данных. Потому что вы не можете запустить свою программу на платформах x86.   -  person Dmitry Sazonov    schedule 16.01.2014
comment
Необходимо объединить несколько многогигабайтных текстовых файлов вместе. Эти данные могут быть загружены в базу данных, но мы хотим по возможности избежать длительного этапа предварительной обработки. Вероятно, эти файлы не будут такими большими, как я сказал, но   -  person Spacen Jasset    schedule 17.01.2014
comment
@Shf да, это верная идея. Я не знаю, будет ли это проще, чем написать собственный виджет или нет.   -  person Spacen Jasset    schedule 17.01.2014


Ответы (2)


Если это табличные данные, я бы использовал таблицу. Я бы написал собственный QTableView с пользовательским QAbstractTableModel. В QTableView у вас есть контроль над всеми видимыми элементами. Я бы поставил какую-то проверку или переменную, совместно используемую между QTableView и ее моделью, чтобы контролировать, сколько данных должно отображаться. Переопределяя метод данных в QAbstractTableModel, вы можете указывать, сколько данных показывать. Вы также можете возиться с полосой прокрутки QTableView, чтобы все выглядело и чувствовалось лучше.

Если вас не волнует редактирование или внешний вид, вы можете использовать простой QTextEdit/QTextBrowser, настроенный только для чтения.

Примечание. Использование QTableWidget с пользовательской моделью несколько бессмысленно. Основное различие между QTableWidget и QTableView заключается в том, что QTableWidget имеет собственную готовую модель.

person justengel    schedule 16.01.2014
comment
Привет ХашСплат. Мне трудно реализовать свой идеал. Не могли бы вы представить больше или дать нам образец проекта для ссылки? Спасибо! - person ngvntoan; 26.04.2016

Известно, что представления Qt медленны при больших объемах данных. Здесь нельзя использовать QTableWidget или QStandardItemModel, потому что они создают новый объект для каждого элемента таблицы. Это вызывает большие накладные расходы. Вы должны начать с реализации собственного быстрого подкласса QAbstractItemModel и отображения его в стандартном QTableView. Вполне возможно, что он будет работать приемлемо быстро. Вы также можете попробовать установить фиксированную высоту строки для представления, чтобы ускорить процесс.

Если это не сработает, вы можете попробовать реализовать собственное табличное представление. Также вы можете использовать Graphics View Framework, как описано в этом ответе.

person Pavel Strakhov    schedule 16.01.2014