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
Здравей HashSplat. Трудно ми е да се реализирам с твоя идеал. Бихте ли могли да представите повече или да ни дадете примерен проект за препратка? Благодаря! - person ngvntoan; 26.04.2016

Известно е, че Qt изгледите са бавни при големи количества данни. QTableWidget или QStandardItemModel не могат да се използват тук, защото създават нов обект за всеки елемент от таблицата. Това причинява големи режийни разходи. Трябва да започнете с внедряването на свой собствен бърз QAbstractItemModel подклас и показването му в стандартен QTableView. Възможно е да работи приемливо бързо. Можете също да опитате да зададете фиксирана височина на реда за изгледа, за да ускорите нещата.

Ако не работи, можете да опитате да приложите свой собствен изглед на таблица. Също така можете да използвате Graphics View Framework, както е описано в този отговор.

person Pavel Strakhov    schedule 16.01.2014