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

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

Страниц: 1 ... 3 4 [5] 6 7   Вниз
  Печать  
Автор Тема: QTableWidget или QAbstractTableModel &QTableView  (Прочитано 57307 раз)
spectre71
Гость
« Ответ #60 : Ноябрь 25, 2009, 01:03 »

Цитировать
void changeHashKeysForColumnsMore(int StartColumn, int Offset) {
//...
}
Offset за что отвечает?
Я должен сместить ключи со значением колонки >= StartColumn на Offset значений вправо

Если Offset=2
StartColumn =1

Все ключи начиная с 1 и до конца всех колонок надо поменять на 3(первая колонка после StartColumn ), 4 (вторая) 5 6 и т.д


Да. Начиная с col(1)

col(1) -> col(3)
col(2) -> col(4)
...
col(m_nColumns-1) -> col(m_nColumns+1)
Записан
daimon
Гость
« Ответ #61 : Ноябрь 25, 2009, 01:45 »

Если использовать не хеш, а список скорость и трудоемкость приложения сильно упадёт?
Записан
daimon
Гость
« Ответ #62 : Ноябрь 25, 2009, 09:46 »

Как можна в хеш-контейнере QHash<QString,QVariant> изменять ключи вставленных элементов без промежуточного элемента?
« Последнее редактирование: Ноябрь 26, 2009, 00:47 от daimon » Записан
spectre71
Гость
« Ответ #63 : Ноябрь 25, 2009, 11:21 »

Как можна в хеш-контейнере QYash<QString,QVariant> изменять ключи вставленных элементов без промежуточного элемента?

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

Тебе так же важно понять что источник данных(Source) и модель(Model) не обязательно одна и та же сущность(объект)!
Model по сути адаптирует или преобразует те или иные запросы к Source. Source нужно строить и оптимизировать с учетом возможных к нему запросов и не только от Model, но и от других сущностей в твоей программе.


Записан
daimon
Гость
« Ответ #64 : Ноябрь 26, 2009, 01:22 »

Правильно было бы проверить в insertColumn(int column)

column>=0&&column<m_nColumns (условие вставки)

m_nColumns - количество всех колонок на данный момент

Правильно?
« Последнее редактирование: Ноябрь 26, 2009, 01:37 от daimon » Записан
spectre71
Гость
« Ответ #65 : Ноябрь 26, 2009, 11:03 »

Правильно было бы проверить в insertColumn(int column)

column>=0&&column<m_nColumns (условие вставки)

m_nColumns - количество всех колонок на данный момент

Правильно?


Тогда скорее column>=0&&column<=m_nColumns
Записан
daimon
Гость
« Ответ #66 : Ноябрь 26, 2009, 23:38 »

В removeColumns(int start,int count.....)
нужно делать проверку, чтобы по значениям start и count не выйти за пределы количества колонок
Записан
spectre71
Гость
« Ответ #67 : Ноябрь 27, 2009, 00:17 »

В removeColumns(int start,int count.....)
нужно делать проверку, чтобы по значениям start и count не выйти за пределы количества колонок

Я проверки делаю всегда.
Записан
daimon
Гость
« Ответ #68 : Ноябрь 28, 2009, 22:29 »

QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
{
   if(role!=Qt::DisplayRole)
   {
      return QVariant();
   }
   return (orientation == Qt::Horizontal) ? QString("ssss"):QString::number(section);
}
списал с книжки
Объясните последнюю строку с помощью if
Записан
spectre71
Гость
« Ответ #69 : Ноябрь 28, 2009, 22:38 »

QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
{
   if(role!=Qt::DisplayRole)
   {
      return QVariant();
   }
   return (orientation == Qt::Horizontal) ? QString("ssss"):QString::number(section);
}
списал с книжки
Объясните последнюю строку с помощью if

А что объяснять - ролей много а мы в данном случае обрабатываем только одну на остальные возвращаем default, т.е. QVariant();
Можно записать и другим образом - обычная логика:

QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
{
    if(role === Qt::DisplayRole) {
        return (orientation == Qt::Horizontal) ? QString("ssss"):QString::number(section);
    } else {
        return QVariant();
    } 
}
Записан
daimon
Гость
« Ответ #70 : Ноябрь 28, 2009, 23:36 »

Как обрабатывать выделенные ячейки в модели (selection range)?
Как реализовать функцию получения индекса ячейки, которая есть выделена?
Записан
daimon
Гость
« Ответ #71 : Ноябрь 29, 2009, 00:14 »

Я хочу реализовать свой QTableWidget только быстрее.
Для этого нужно создать свою модель таблицы; создать класс наследник от своей модели и класса QTableView

Правильно ли я буду делать?
Записан
daimon
Гость
« Ответ #72 : Ноябрь 29, 2009, 21:51 »

Как реализовать модель для заполнения её данными циклом (таблица 10000*10000)?
QHash<QPair<int,int>,QVariant> просто цикл в лоб занимает очень много времени и 2 гига оперативы.
Как оптимизировать?
Записан
Kolobok
Гость
« Ответ #73 : Ноябрь 29, 2009, 23:43 »

Как реализовать модель для заполнения её данными циклом (таблица 10000*10000)?
QHash<QPair<int,int>,QVariant> просто цикл в лоб занимает очень много времени и 2 гига оперативы.
Как оптимизировать?

А что ты хочешь, одни индексы занимают почти 400 MB.

Я бы сделал так:

int rows;
int columns;
QVector< QVariant > data;

data.resize( rows * columns );

А почему QVariant ?
Записан
daimon
Гость
« Ответ #74 : Ноябрь 29, 2009, 23:50 »

Как реализовать модель для заполнения её данными циклом (таблица 10000*10000)?
QHash<QPair<int,int>,QVariant> просто цикл в лоб занимает очень много времени и 2 гига оперативы.
Как оптимизировать?

А что ты хочешь, одни индексы занимают почти 400 MB.

Я бы сделал так:

int rows;
int columns;
QVector< QVariant > data;

data.resize( rows * columns );

А почему QVariant ?
Хочется сделать универсальную таблицу (хочу потом добавить итемы чекбоксы)
Записан
Страниц: 1 ... 3 4 [5] 6 7   Вверх
  Печать  
 
Перейти в:  


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