Название: QTableView и QTableModel Отправлено: Jager-ntr от Апрель 21, 2008, 16:07 Добрый вечер. Встал вопрос - как можно реализовать следующее: есть таблица, в каждой ячейки имеются данные(какая-то надпись, например),но этой же ячейке соответствует набор данных(который визуально не отображается), который отображается в виде нового окна с таблицей в нем, по двойному нажатию на выбранную ячейку?
Название: Re: QTableView и QTableModel Отправлено: ритт от Апрель 21, 2008, 16:23 установить нужные данные в нужные индексы для нужн(ой роли|ых ролей)
читать документация по модель-вью Название: Re: QTableView и QTableModel Отправлено: Jager-ntr от Апрель 22, 2008, 09:41 да,с этим все нормально решилось. Мне надо, чтобы по двойному щелчку на ячейке происходили определенные действия.Для этого я делаю следующее:
Код: pTable = new QTableView(); Название: Re: QTableView и QTableModel Отправлено: denka от Апрель 22, 2008, 10:32 1 В Qt нет класса Object, но думаю это опечатка :)
2 В макросах типа SIGNAL или SLOT вы должны указывать прототип ф-ции без формальных параметров. Т.е. QObject::connect(pTable, SIGNAL(doubleClicked(QModelIndex& )),this, SLOT(slotItemClicked(QModelIndex& ))); Название: Re: QTableView и QTableModel Отправлено: Jager-ntr от Апрель 22, 2008, 12:00 Да, с Object у меня опечатка вышла,а с сигнал-слотом неправильно указал сигнатуру. У меня в каждой ячейке таблицы содержится объект класса CTableItem(мной написанный). QTableView строится нормально,а для получения айтема ячейки использую следющий код:
Код: CTableItem* item = static_cast<CTableItem*>(pTable->model()->index(index.row(), index.column()).internalPointer();//переменная index передается из сигнала по двойному нажатию на ячейку QTableView Название: Re: QTableView и QTableModel Отправлено: denka от Апрель 22, 2008, 12:33 Проверьте не возвращаете ли вы нулевой указатель internalPointer(). Да и вобще лучше бы сразу привели код, как вы формируете индекс в модели. Лично мне не понятно из такого кода в чем может быть проблема :)
Название: Re: QTableView и QTableModel Отправлено: Jager-ntr от Апрель 22, 2008, 13:08 с концепцией модель-представление раньше не работал,отсюда и проблемы. Формирование индекса в своей модели я не переопределял,а предыдущий код возвращает как раз нулевой указатель...Пример создания индекса есть?смотрел пример для дерева,но тот вариант не подходит
Название: Re: QTableView и QTableModel Отправлено: denka от Апрель 22, 2008, 14:06 Смотрим реализацию ф-ции index в QAbstractTableModel:
QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent) const { return hasIndex(row, column, parent) ? createIndex(row, column, 0) : QModelIndex(); } Все что вам нужно сделать, так это заменить 3 параметр ф-ции createIndex на соответствующие данные. Анализируете строку и колнку, находите для них соответствующий CTableItem(к сожелению не знаю как у вас организовано хранение этих итемов) и передаете указатель на этот итем в ф-цию createIndex. Название: Re: QTableView и QTableModel Отправлено: Jager-ntr от Апрель 22, 2008, 15:22 для простоты,объекты этого класс должны находиться в каждой ячейке:
Код: class CTableItem Далее код переопределенных методов в классе моей модели: Код: Для хранения айтемов CTableItem в классе модели используется QHash<QModelIndex, CTableItem> m_hash Так я заношу данные в модель: Код: CDragDropModel* model = new CDragDropModel(3, 3); Название: Re: QTableView и QTableModel Отправлено: denka от Апрель 22, 2008, 16:58 Думаю все таки вам стоит почитать соответствующий раздел ассистента. Ф-ция index в модели используеться именно для формирования индекса модели. Третим параметром туда передаеться индекс парента, вы же используете его для доступа к даным в хеше, интерпритируя его как текущий индекс. Это не есть правельно!!!. Предлагаю следующее:
1) Изменить форму хранения CTableItem. Так чтоб доступ не зависел от QModelIndex. Скажем пускай будет так typedef QPair<int, int> TableIndex; QHash<TableIndex, CTableItem*> m_hash; здесь еще надо реализовать ф-цию qHash() (см. Assistant). Вторым параметром предпочтительней использовать указатель. Тот вариант который был у вас не коректен. Если вы еще раз посмотрите на код в ф-ции index то увидете что там вы возвращаете адрес локального объекта. Это не позволительно, т.к. при фыходе из этой ф-ции локальный объект разрушаеться и у вас остаеться указатель на "муссор". Из-за этого могут быть проблемы хуже чем с нудевым указателем :) 2) Ф-ция data приймет такой вид: QVariant CDragDropModel::data(const QModelIndex &index, int nRole) const { if(index.isValid()) { if ( nRole == Qt::DisplayRole || nRole == Qt::EditRole ) // вобще EditRole на сколько я знаю используеться для установки данных { if ( CTableItem * item = static_cast<CTableItem *>(index.internalPointer()) ) // коректный индекс уже содержит указатель на нужные нам данные { return item->itemCaption; } } } return QVariant(); } 3) ф-ция index будет выглядеть так: QModelIndex CDragDropModel::index(int row, int column, const QModelIndex &parent) const { if(!hasIndex(row, column, parent)) return QModelIndex(); TableIndex index = qMakePair( row, column ); CTableItem * item = m_hash[index]; return createIndex(row, column, item); // вот теперь ф-ция internalPointer() будет возвращать указатель на нужные нам данные } 4) ф-ция setData может быть такой bool CDragDropModel::setData(QModelIndex &index, const CTableItem& value, int nRole) { if(index.isValid() && nRole == Qt::EditRole)// установка происходит по EditRole!!! у вас было DisplayRole { if ( CTableItem * item = static_cast<CTableItem *>(index.internalPointer()) ) // коректный индекс уже содержит указатель на нужные нам данные { item->itemCaption = value; emit dataChanged(index, index); return true; } } return false; } 5) Понятия не имею расширяеться у вас таблица или остаеться статичной взависемости от этого вам уже самому решать как формировать ваш хеш данных. Название: Re: QTableView и QTableModel Отправлено: Вячеслав от Апрель 22, 2008, 20:27 А вообще IMHO проще глянуть на examples\itemviews\simpletreemodel тама все прозрачно разжевано...
|