Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Fat-Zer от Январь 09, 2011, 05:56



Название: Отображение различных виджетов для различных элементов модели
Отправлено: Fat-Zer от Январь 09, 2011, 05:56
Собственно сабж.
Есть модель, есть TreeView, при выборе определённого элемента в виде надо на соседнем виджете отобразить правильное окно настроек. Как это правильно было бы сделать?


Название: Re: Отображение различных виджетов для различных элементов модели
Отправлено: Karl-Philipp от Январь 09, 2011, 11:17
Можно, например, определять индекс элемента в TreeView, на основе чего отображать нужные настройки.


Название: Re: Отображение различных виджетов для различных элементов модели
Отправлено: Fat-Zer от Январь 09, 2011, 11:44
Можно, например, определять индекс элемента в TreeView, на основе чего отображать нужные настройки.

Сейчас делаю так:
Код
C++ (Qt)
connect(ui->treeView->selectionModel(),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(updateItemEdit(QItemSelection)));
//......................
 
void MainWindow::updateItemEdit(const QItemSelection & itsel)
{
delete itemEditWidget;
itemEditWidget = ((SceneItem*)itsel.indexes().first().internalPointer())
->createSettingWidget(ui->itemEdit);
ui->itemEdit->layout()->addWidget(itemEditWidget);
 
}
 
Где createSettingWidget(ui->itemEdit); - виртуальный метод у каждого наследника SceneItem, который создаёт виджет с данным родителем.
Вы, я так понял, тоже самое имели в виду?

Но я собираючь отказываться от SceneItem'ов, так как модель это просто интерфейс между своей структурой данных и видом qt, а так как она сейчас реализована приходится выращивать отдельную иерархию для айтемов для модели параллельно с основной структурой и там приходится применять различные неуклюжие методы. Да и выглядит всё это очень громоздко... Если у меня до этого руки дойдут, то хочу избавится от этого "второго дерева" и получать этот виджет через саму модель (может использовать свою роль ???) что посоветуете?


Название: Re: Отображение различных виджетов для различных элементов модели
Отправлено: Karl-Philipp от Январь 09, 2011, 11:58
Я думал сделать что-то вроде такого:

Код
C++ (Qt)
bool TreeView::event(QEvent *event)
{
   emit signalCurrentIndex(currentIndex());
 
   return QWidget::event(event);
}
 
...
QObject::connect(treeViewObject, SIGNAL(signalCurrentIndex(QModelIndex)), settingsWidget, SLOT(slotShowCustomSettings(QModelIndex)));


В слоте определять номер строки (и если надо столбца элемента) на основе чего показывать соответствующие настройки.


Название: Re: Отображение различных виджетов для различных элементов модели
Отправлено: Fat-Zer от Январь 09, 2011, 12:20
Тоже вариант... но надо ещё думать какой фильтр на событие прикрутить... не по каждому же чиху виджет дёргать... и опять же проблема как поприличней соотнести QModelIndex с нужным виджетом в итоге получаем теже яица, только в профиль... да и наследовать надо QTreeWidget... =/


Название: Re: Отображение различных виджетов для различных элементов модели
Отправлено: Karl-Philipp от Январь 09, 2011, 12:56
Возможно стоило глянуть сначала на
Цитировать
void QAbstractItemView::activated ( const QModelIndex & index ) [signal]

This signal is emitted when the item specified by index is activated by the user.
по поводу соотношения QModelIndex с нужным виджетом:
ничего не вижу неприличного в том, чтобы связывать сигнал и слот, передавая текущий индекс :) В классе QModelIndex есть же методы row() и colomn().