Russian Qt Forum
Ноябрь 06, 2024, 18:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 4 5 [6] 7   Вниз
  Печать  
Автор Тема: QTableWidget или QAbstractTableModel &QTableView  (Прочитано 57322 раз)
daimon
Гость
« Ответ #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
Гость
« Ответ #76 : Ноябрь 30, 2009, 00:31 »

вектор размером(10000*10000) не создается, а хеш да
Записан
daimon
Гость
« Ответ #77 : Ноябрь 30, 2009, 00:50 »

Как реализовать модель для заполнения её данными циклом (таблица 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
Гость
« Ответ #78 : Ноябрь 30, 2009, 22:09 »

или лучше использовать А может QHash<int,QVariant*>
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #79 : Ноябрь 30, 2009, 22:20 »

вектор размером(10000*10000) не создается, а хеш да
Когда таблица пустая - да, создается. А когда начнет заполняться - hash съест больше чем вектор. И что тогда будете делать?
Записан
daimon
Гость
« Ответ #80 : Ноябрь 30, 2009, 22:30 »

вектор размером(10000*10000) не создается, а хеш да
Когда таблица пустая - да, создается. А когда начнет заполняться - hash съест больше чем вектор. И что тогда будете делать?
с вектором проблема для функций вставки колонки, где нужно менять индексы для элементов (для этого нужно резервировать место полностью под вектор). Но так как индекс это порядковый номер в таблице - нужно перебрать весь вектор, а в хеше удаляешь старый элемент с ключом и ставишь новый
Записан
daimon
Гость
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #82 : Декабрь 01, 2009, 11:30 »

с вектором проблема для функций вставки колонки, где нужно менять индексы для элементов (для этого нужно резервировать место полностью под вектор). Но так как индекс это порядковый номер в таблице - нужно перебрать весь вектор, а в хеше удаляешь старый элемент с ключом и ставишь новый
Не путайте "мне меньше писать" с "производительностью", удаление/вставка в hash много чего делает каждая. Не храните индексы (row, column) для каждого элемента ни в каком виде - это никак Вам не поможет выкрутиться с памятью. Используйте простую и естественную модель, вариантов много

QVector <QVariant>          // съест меньше всех памяти но нужно пересоздавать при вставке/удалении
QList <QList<QVariant>>   //  съест чуть больше памяти но легко удалять/вставлять
QVector <QVector<QVariant>>   // промежуточный
и.т.п.

Умерьте Ваши притязания на "очень большую таблицу" - до этого еще дожить надо
Записан
spectre71
Гость
« Ответ #83 : Декабрь 01, 2009, 11:56 »

с вектором проблема для функций вставки колонки, где нужно менять индексы для элементов (для этого нужно резервировать место полностью под вектор). Но так как индекс это порядковый номер в таблице - нужно перебрать весь вектор, а в хеше удаляешь старый элемент с ключом и ставишь новый
Не путайте "мне меньше писать" с "производительностью", удаление/вставка в hash много чего делает каждая. Не храните индексы (row, column) для каждого элемента ни в каком виде - это никак Вам не поможет выкрутиться с памятью. Используйте простую и естественную модель, вариантов много

QVector <QVariant>          // съест меньше всех памяти но нужно пересоздавать при вставке/удалении
QList <QList<QVariant>>   //  съест чуть больше памяти но легко удалять/вставлять
QVector <QVector<QVariant>>   // промежуточный
и.т.п.

Умерьте Ваши притязания на "очень большую таблицу" - до этого еще дожить надо

Я об этом уже писал выше.
Приводил вариант как это можно очень просто сделать!

- Можно также не премещать физически столбцы/строки, а делать переиндексацию - завести например:
QHash<int,int> ColIndex; QHash<int,int> RowIndex; где ключ - VisualIndex(который фактически соответствует визуализации на уровне View), а значение - LogicalIndex(который есть соответствующая часть ключа для SrcData), аналогично тому как сделано в QHeaderView. При этом не обязательно для переиндексации использовать QHash, можно и просто массив int ColIndex[MAX_COL_NUM] если предполагается ограничение на кол-во колонок/строк.
- Можно использовать и другие подходы для оптимизации, все зависит от задачи

Безполезно что-либо объяснять, только трата времени. Человек не читает и не пытается понять. Все время возвращается к своей начальной идее выделеить кучу памяти под все.

Записан
daimon
Гость
« Ответ #84 : Декабрь 01, 2009, 23:41 »

А если создать QList<QList<QVariant*>>
Заполнять такой список полностью построчно (таблица 100*100 - в списке 10000 элементов)
Все не заполненные ячейки таблицы (пользователем)- пустые указатели.
Такой вариант убъет память на таблице 5000*5000

Преимущество такого варианта над хешом 100 метров на 5000*2000
а времени переписать код мало
« Последнее редактирование: Декабрь 02, 2009, 00:33 от daimon » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #85 : Декабрь 02, 2009, 13:10 »

А если создать QList<QList<QVariant*>>
Заполнять такой список полностью построчно (таблица 100*100 - в списке 10000 элементов)
Все не заполненные ячейки таблицы (пользователем)- пустые указатели.
Такой вариант убъет память на таблице 5000*5000

Преимущество такого варианта над хешом 100 метров на 5000*2000
Не вижу ничего плохого в такой модели

а времени переписать код мало
Да Вы на форуме уже раз в 10 больше времени потеряли Улыбающийся Перепишите за час на новую модель - и дело с концом
Записан
daimon
Гость
« Ответ #86 : Декабрь 03, 2009, 00:28 »

Как делать resize для списка QList<QList<QVariant*>>, чтобы не делать ресайз каждой строки списка в цикле?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #87 : Декабрь 03, 2009, 13:42 »

Как делать resize для списка QList<QList<QVariant*>>, чтобы не делать ресайз каждой строки списка в цикле?
QList не имеет resize - но он Вам и не нужен. Используйте insert в цикле для вставки столбцов и erase для их удаления. 
Записан
daimon
Гость
« Ответ #88 : Декабрь 03, 2009, 21:07 »

Как делать resize для списка QList<QList<QVariant*>>, чтобы не делать ресайз каждой строки списка в цикле?
QList не имеет resize - но он Вам и не нужен. Используйте insert в цикле для вставки столбцов и erase для их удаления. 
Тогда список не подойдет как контейнер (как тогда узнать индекс) - лучше вектор (индекс ячейки оператор [])
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #89 : Декабрь 03, 2009, 21:11 »

Тогда список не подойдет как контейнер (как тогда узнать индекс) - лучше вектор (индекс ячейки оператор [])
QList - это тоже массив (не смущайтесь что list это "список") он имеет оператор [] так же как и QVector.
Записан
Страниц: 1 ... 4 5 [6] 7   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.146 секунд. Запросов: 23.