Russian Qt Forum
Ноябрь 06, 2024, 18:30
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QTableWidget или QAbstractTableModel &QTableView
Страниц:
1
...
4
5
[
6
]
7
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QTableWidget или QAbstractTableModel &QTableView (Прочитано 57314 раз)
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #75 :
Ноябрь 30, 2009, 00:02 »
с вектором проблематично переписать такой код и вектор будет содержать несколько миллионов значений
void Table_model::changeHashColumns(int StartColumn, int Offset, bool insert_remove)
{
int i=0;
for (int row = 0; row < numRows; ++row)
{
//if(Offset==numColumns)
// i=numColumns;
//else i=numColumns-Offset;
for( i=numColumns-1;i>=StartColumn; i--)
{
if(!hash_items.value(QPair<int,int> (row,i)).isNull())
{
if(insert_remove==true) hash_items[QPair<int,int> (row,i+Offset)]=hash_items[QPair<int,int> (row,i)];
hash_items.remove(QPair<int,int> (row,i));
}
}
}
}
//------------insert column
bool Table_model::insertColumns(int startcol, int count, const QModelIndex &parent)
{
if(startcol>=0 && startcol<=numColumns&& count>=1)
{
beginInsertColumns(QModelIndex(), startcol, startcol+count-1);
if(startcol <= numColumns) {changeHashColumns(startcol, count,true);}
//numColumns += count;
for(int i=0;i<count;i++)
{
names_for_columns.insert(startcol+i,for_column_name_from_number(numColumns));
numColumns ++;
}
//setHorizontalHeaderLabels(names_for_columns);
/*
if(number_column_into_paste==0)
setCurrentCell(0,number_column_into_paste);
else
setCurrentCell(0,number_column_into_paste-1);*/
endInsertColumns();
return true;
}
else false;
}
void Table_model::insertColumn(int column, const QModelIndex &parent)
{
if(column>=0 && column<=numColumns)
insertColumns(column,1,parent);
}
помогите переписать код для вектора проблема в insert columns -> changeHashColumns
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #76 :
Ноябрь 30, 2009, 00:31 »
вектор размером(10000*10000) не создается, а хеш да
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #77 :
Ноябрь 30, 2009, 00:50 »
Цитата: Kolobok от Ноябрь 29, 2009, 23:43
Цитата: daimon от Ноябрь 29, 2009, 21:51
Как реализовать модель для заполнения её данными циклом (таблица 10000*10000)?
QHash<QPair<int,int>,QVariant> просто цикл в лоб занимает очень много времени и 2 гига оперативы.
Как оптимизировать?
А что ты хочешь, одни индексы занимают почти 400 MB.
Я бы сделал так:
int rows;
int columns;
QVector< QVariant > data;
data.resize( rows * columns );
А почему QVariant ?
А может QHash<int,QVariant>
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #78 :
Ноябрь 30, 2009, 22:09 »
или лучше использовать А может QHash<int,QVariant*>
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #79 :
Ноябрь 30, 2009, 22:20 »
Цитата: daimon от Ноябрь 30, 2009, 00:31
вектор размером(10000*10000) не создается, а хеш да
Когда таблица пустая - да, создается. А когда начнет заполняться - hash съест больше чем вектор. И что тогда будете делать?
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #80 :
Ноябрь 30, 2009, 22:30 »
Цитата: Igors от Ноябрь 30, 2009, 22:20
Цитата: daimon от Ноябрь 30, 2009, 00:31
вектор размером(10000*10000) не создается, а хеш да
Когда таблица пустая - да, создается. А когда начнет заполняться - hash съест больше чем вектор. И что тогда будете делать?
с вектором проблема для функций вставки колонки, где нужно менять индексы для элементов (для этого нужно резервировать место полностью под вектор). Но так как индекс это порядковый номер в таблице - нужно перебрать весь вектор, а в хеше удаляешь старый элемент с ключом и ставишь новый
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #81 :
Ноябрь 30, 2009, 22:35 »
struct Data
{
QVariant a;
int row;
int column;
}
QVector<Data> f;
такой вектор будет жрать меньше, чем QHash<QPair<int,int>,QVariant>
«
Последнее редактирование: Ноябрь 30, 2009, 22:37 от daimon
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #82 :
Декабрь 01, 2009, 11:30 »
Цитата: daimon от Ноябрь 30, 2009, 22:30
с вектором проблема для функций вставки колонки, где нужно менять индексы для элементов (для этого нужно резервировать место полностью под вектор). Но так как индекс это порядковый номер в таблице - нужно перебрать весь вектор, а в хеше удаляешь старый элемент с ключом и ставишь новый
Не путайте "мне меньше писать" с "производительностью", удаление/вставка в hash много чего делает каждая. Не храните индексы (row, column) для каждого элемента ни в каком виде - это никак Вам не поможет выкрутиться с памятью. Используйте простую и естественную модель, вариантов много
QVector <QVariant> // съест меньше всех памяти но нужно пересоздавать при вставке/удалении
QList <QList<QVariant>> // съест чуть больше памяти но легко удалять/вставлять
QVector <QVector<QVariant>> // промежуточный
и.т.п.
Умерьте Ваши притязания на "очень большую таблицу" - до этого еще дожить надо
Записан
spectre71
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #83 :
Декабрь 01, 2009, 11:56 »
Цитата: Igors от Декабрь 01, 2009, 11:30
Цитата: daimon от Ноябрь 30, 2009, 22:30
с вектором проблема для функций вставки колонки, где нужно менять индексы для элементов (для этого нужно резервировать место полностью под вектор). Но так как индекс это порядковый номер в таблице - нужно перебрать весь вектор, а в хеше удаляешь старый элемент с ключом и ставишь новый
Не путайте "мне меньше писать" с "производительностью", удаление/вставка в hash много чего делает каждая. Не храните индексы (row, column) для каждого элемента ни в каком виде - это никак Вам не поможет выкрутиться с памятью. Используйте простую и естественную модель, вариантов много
QVector <QVariant> // съест меньше всех памяти но нужно пересоздавать при вставке/удалении
QList <QList<QVariant>> // съест чуть больше памяти но легко удалять/вставлять
QVector <QVector<QVariant>> // промежуточный
и.т.п.
Умерьте Ваши притязания на "очень большую таблицу" - до этого еще дожить надо
Я об этом уже писал выше.
Приводил вариант как это можно очень просто сделать!
Цитата: Spectre от Ноябрь 25, 2009, 11:21
- Можно также не премещать физически столбцы/строки, а делать переиндексацию - завести например:
QHash<int,int> ColIndex; QHash<int,int> RowIndex; где ключ - VisualIndex(который фактически соответствует визуализации на уровне View), а значение - LogicalIndex(который есть соответствующая часть ключа для SrcData), аналогично тому как сделано в QHeaderView. При этом не обязательно для переиндексации использовать QHash, можно и просто массив int ColIndex[MAX_COL_NUM] если предполагается ограничение на кол-во колонок/строк.
- Можно использовать и другие подходы для оптимизации, все зависит от задачи
Безполезно что-либо объяснять, только трата времени. Человек не читает и не пытается понять. Все время возвращается к своей начальной идее выделеить кучу памяти под все.
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #84 :
Декабрь 01, 2009, 23:41 »
А если создать QList<QList<QVariant*>>
Заполнять такой список полностью построчно (таблица 100*100 - в списке 10000 элементов)
Все не заполненные ячейки таблицы (пользователем)- пустые указатели.
Такой вариант убъет память на таблице 5000*5000
Преимущество такого варианта над хешом 100 метров на 5000*2000
а времени переписать код мало
«
Последнее редактирование: Декабрь 02, 2009, 00:33 от daimon
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #85 :
Декабрь 02, 2009, 13:10 »
Цитата: daimon от Декабрь 01, 2009, 23:41
А если создать QList<QList<QVariant*>>
Заполнять такой список полностью построчно (таблица 100*100 - в списке 10000 элементов)
Все не заполненные ячейки таблицы (пользователем)- пустые указатели.
Такой вариант убъет память на таблице 5000*5000
Преимущество такого варианта над хешом 100 метров на 5000*2000
Не вижу ничего плохого в такой модели
Цитата: daimon от Декабрь 01, 2009, 23:41
а времени переписать код мало
Да Вы на форуме уже раз в 10 больше времени потеряли
Перепишите за час на новую модель - и дело с концом
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #86 :
Декабрь 03, 2009, 00:28 »
Как делать resize для списка QList<QList<QVariant*>>, чтобы не делать ресайз каждой строки списка в цикле?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #87 :
Декабрь 03, 2009, 13:42 »
Цитата: daimon от Декабрь 03, 2009, 00:28
Как делать resize для списка QList<QList<QVariant*>>, чтобы не делать ресайз каждой строки списка в цикле?
QList не имеет resize - но он Вам и не нужен. Используйте insert в цикле для вставки столбцов и erase для их удаления.
Записан
daimon
Гость
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #88 :
Декабрь 03, 2009, 21:07 »
Цитата: Igors от Декабрь 03, 2009, 13:42
Цитата: daimon от Декабрь 03, 2009, 00:28
Как делать resize для списка QList<QList<QVariant*>>, чтобы не делать ресайз каждой строки списка в цикле?
QList не имеет resize - но он Вам и не нужен. Используйте insert в цикле для вставки столбцов и erase для их удаления.
Тогда список не подойдет как контейнер (как тогда узнать индекс) - лучше вектор (индекс ячейки оператор [])
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QTableWidget или QAbstractTableModel &QTableView
«
Ответ #89 :
Декабрь 03, 2009, 21:11 »
Цитата: daimon от Декабрь 03, 2009, 21:07
Тогда список не подойдет как контейнер (как тогда узнать индекс) - лучше вектор (индекс ячейки оператор [])
QList - это тоже массив (не смущайтесь что list это "список") он имеет оператор [] так же как и QVector.
Записан
Страниц:
1
...
4
5
[
6
]
7
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...