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

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

Страниц: 1 2 3 [4] 5 6 7   Вниз
  Печать  
Автор Тема: QTableWidget или QAbstractTableModel &QTableView  (Прочитано 57283 раз)
daimon
Гость
« Ответ #45 : Ноябрь 24, 2009, 02:47 »

Ну и начудил!

Добавляем метод:

QString getKey(int row, int column) {
  QString key(QString::number(index.row()));
  key.append(".");
  key.append(QString::number(index.column()));
  return key;
}

Исправляем:

1)
//QHash<QModelIndex, QVariant> m_hash;
QHash<QString, QVariant> m_hash;
2)
//return (nRole == Qt::DisplayRole || nRole == Qt::EditRole)
//               ? m_hash.value(index, QVariant())
//               : QVariant();
if(nRole == Qt::DisplayRole || nRole == Qt::EditRole) {
  QString key(getKey(index.row(), index.column()));
  if(hash.contains(key)) {return m_hash.value(key);}
  else                   {return index.row();}
}
return QVariant();

3)
//m_hash[index] = value.toString();
  QString key(getKey(index.row(), index.column()));
  m_hash[key] = value.toString();

4) Убираем вложенный цикл заполнения
//for(int i = 0; i < rows; i++)
//            for(int j = 0; j < columns; j++)
//            {
//               QModelIndex index = model.index(i, j);
//               model.setData(index, i, Qt::EditRole);
//                   tableView.setModel(&model);
//    tableView.show();
//
//               app.processEvents();
//            }
А если мне нужно добавлять в цикле элементы, что делать?
И как переписать insertColumn(...)
Записан
spectre71
Гость
« Ответ #46 : Ноябрь 24, 2009, 03:05 »

А если мне нужно добавлять в цикле элементы, что делать?
И как переписать insertColumn(...)
Я уже тебе показал на твоем примере как можно обойти тормоза.
Что ты хочешь добавлять по циклу?
1) Если тебе необходимо увеличить диапазон таблицы:
    m_nRows;
    m_nColumns;
То нужно использовать:
void beginInsertColumns ( const QModelIndex & parent, int first, int last )
void beginInsertRows ( const QModelIndex & parent, int first, int last )
void endInsertColumns ()
void endInsertRows ()
1) Если тебе необходимо уменьшить диапазон таблицы:
    m_nRows;
    m_nColumns;
То нужно использовать:
void beginRemoveColumns ( const QModelIndex & parent, int first, int last )
void beginRemoveRows ( const QModelIndex & parent, int first, int last )
void endRemoveColumns ()
void endRemoveRows ()
2) Если хочешь изменить значения в большом кол-ве ячеек за раз, то зачастую не обязательно заносить их все в hash, возможно можно большую часть вычислять на лету и возвращать вычисленное значение в:
QVariant data(const QModelIndex& index, int nRole) const
Записан
daimon
Гость
« Ответ #47 : Ноябрь 24, 2009, 03:09 »

А если мне нужно добавлять в цикле элементы, что делать?
И как переписать insertColumn(...)
Я уже тебе показал на твоем примере как можно обойти тормоза.
Что ты хочешь добавлять по циклу?
1) Если тебе необходимо увеличить диапазон таблицы:
    m_nRows;
    m_nColumns;
То нужно использовать:
void beginInsertColumns ( const QModelIndex & parent, int first, int last )
void beginInsertRows ( const QModelIndex & parent, int first, int last )
void endInsertColumns ()
void endInsertRows ()
1) Если тебе необходимо уменьшить диапазон таблицы:
    m_nRows;
    m_nColumns;
То нужно использовать:
void beginRemoveColumns ( const QModelIndex & parent, int first, int last )
void beginRemoveRows ( const QModelIndex & parent, int first, int last )
void endRemoveColumns ()
void endRemoveRows ()
2) Если хочешь изменить значения в большом кол-ве ячеек за раз, то зачастую не обязательно заносить их все в hash, возможно можно большую часть вычислять на лету и возвращать вычисленное значение в:
QVariant data(const QModelIndex& index, int nRole) const

Какой должен быть QModelIndex & parent для того, чтобы  insertColumn(...) работал правильно
Записан
spectre71
Гость
« Ответ #48 : Ноябрь 24, 2009, 03:16 »

Какой должен быть QModelIndex & parent для того, чтобы  insertColumn(...) работал правильно
Читай доку, не будет таких вопросов.
Я уже устал от них!

В твоем случае(в случае списка или таблицы) parent - пустой, т.е  == QModelIndex().
Не пустой он в случае деревьев.
Записан
daimon
Гость
« Ответ #49 : Ноябрь 24, 2009, 03:22 »

Какой должен быть QModelIndex & parent для того, чтобы  insertColumn(...) работал правильно
Читай доку, не будет таких вопросов.
Я уже устал от них!

В твоем случае(в случае списка или таблицы) parent - пустой, т.е  == QModelIndex().
Не пустой он в случае деревьев.
Где среди библиотек Qt спрятан исходник под абстрактный класс  QAbstracnTableModel - нужна функция insertColumn()
Не могу понять почему эта функция работает неправильно.
Нужно переписать для ёё правильной работы НепонимающийНепонимающий??
void beginInsertColumns ( const QModelIndex & parent, int first, int last )
void beginInsertRows ( const QModelIndex & parent, int first, int last )
void endInsertColumns ()
void endInsertRows ()
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #50 : Ноябрь 24, 2009, 03:33 »

daimon, по твоему примеру:
убери tableView.show(); из цикла добавления.
лучше отобрази сначала представление пользователю, а затем начинай добавлять элементы
Записан

Юра.
daimon
Гость
« Ответ #51 : Ноябрь 24, 2009, 03:34 »

Будьте добры, ковырялся в исходниках - Qt не могу понять как пашет эта insertColumn(..)
Просветите тёмного
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #52 : Ноябрь 24, 2009, 06:47 »

см. подробное описание функции
void QAbstractItemModel::beginInsertColumns ( const QModelIndex & parent, int first, int last )   [protected]

Почитай Создание собственных моделей
« Последнее редактирование: Ноябрь 24, 2009, 06:55 от lit-uriy » Записан

Юра.
spectre71
Гость
« Ответ #53 : Ноябрь 24, 2009, 16:37 »

daimon, по твоему примеру:
убери tableView.show(); из цикла добавления.
лучше отобрази сначала представление пользователю, а затем начинай добавлять элементы

Сперва прочитай!
http://www.doc.crossplatform.ru/qt/4.4.3/model-view-creating-models.html#an-editable-model

И только потом если что не понятно, спрашивай.


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

см. подробное описание функции
void QAbstractItemModel::beginInsertColumns ( const QModelIndex & parent, int first, int last )   [protected]

Почитай Создание собственных моделей
Как будет выглядеть реализация этой функции для контейнера  QHash<QModelIndex, QVariant> m_hash (например).
Под колонку нужно оставить место в контейнере?
Записан
spectre71
Гость
« Ответ #55 : Ноябрь 24, 2009, 23:10 »

см. подробное описание функции
void QAbstractItemModel::beginInsertColumns ( const QModelIndex & parent, int first, int last )   [protected]

Почитай Создание собственных моделей
Как будет выглядеть реализация этой функции для контейнера  QHash<QModelIndex, QVariant> m_hash (например).
Под колонку нужно оставить место в контейнере?


Код
C++ (Qt)
bool insertColumns(int startcol, int count, const QModelIndex &parent)  {
    if(startcol!= m_nColumns) {return false;}
    beginInsertColumns(QModelIndex(), startcol, startcol+count-1);
    m_nColumns +=  count;
    endInsertColumns();
    return true;
}

Превая строчка: if(column != m_nColumns) {return false;} - Блокирует вставку колонок внутрь, т.е. данная реализация insertColumns будет позволять только добавлять  колонки в конец!
Чтобы снять ограничение прийдется еще изменять key для сохраненных значений в твоем m_hash у которых column >= startcol

Код
C++ (Qt)
bool insertColumns(int startcol, int count, const QModelIndex &parent)  {
    beginInsertColumns(QModelIndex(), startcol, startcol+count-1);
    if(column != m_nColumns) {changeHashKeysForColumnsMore(startcol, count);}
    m_nColumns +=  count;
    endInsertColumns();
    return true;
}
void changeHashKeysForColumnsMore(int StartColumn, int Offset) {
//...
}
 
 


Записан
daimon
Гость
« Ответ #56 : Ноябрь 24, 2009, 23:42 »

Ну и начудил!

Добавляем метод:

QString getKey(int row, int column) {
  QString key(QString::number(index.row()));
  key.append(".");
  key.append(QString::number(index.column()));
  return key;
}
Вопрос: откуда в этой функции index?
Записан
daimon
Гость
« Ответ #57 : Ноябрь 25, 2009, 00:18 »

Цитировать
void changeHashKeysForColumnsMore(int StartColumn, int Offset) {
//...
}
Offset за что отвечает?
Записан
spectre71
Гость
« Ответ #58 : Ноябрь 25, 2009, 00:32 »

Ну и начудил!

Добавляем метод:

QString getKey(int row, int column) {
  QString key(QString::number(index.row()));
  key.append(".");
  key.append(QString::number(index.column()));
  return key;
}
Вопрос: откуда в этой функции index?

Оттуда, кусок был перенесен  из другого места.
Если бы ты вообще пытался понять что написано, то заметил бы что это элементарная ошибка  и сам бы исправил.

Код
C++ (Qt)
QString getKey(int row, int column)
 QString key(QString::number(row));  
 key.append(".");
 key.append(QString::number(column));
 return key;
}

А использовать в качестве ключа для hash QModelIndex ("QHash<QModelIndex, QVariant> m_hash;) идея просто бредовая.
Записан
daimon
Гость
« Ответ #59 : Ноябрь 25, 2009, 00:56 »

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

Если Offset=2
StartColumn =1

Все ключи начиная с 1 и до конца всех колонок надо поменять на 3(первая колонка после StartColumn ), 4 (вторая) 5 6 и т.д
Записан
Страниц: 1 2 3 [4] 5 6 7   Вверх
  Печать  
 
Перейти в:  


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