Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Ncs от Октябрь 21, 2008, 16:59



Название: Изменение состояния делегата текущей ячейки от содержимого соседней ячейки.
Отправлено: Ncs от Октябрь 21, 2008, 16:59
Доброго времени суток!

Qt 4.2 или 4.3

Вопрос: необходимо создать делегат для ячейки в таблице QSqlTableModel, так чтобы поведение содержимого выпадающего списка зависело от содержимого соседней ячейки.
К примеру, условно ячейка  1 строки N (редактируемая в данный момент строка) может содержать либо «a», либо «b», либо «c». Пользователь, переходя курсором в ячейку 2 строки N получает:
- список 1, если было «а» в ячейке 1 строки N
- список 2, если было «b» в ячейке 1 строки N
- список 3, если было «c» в ячейке 1 строки N.
Не понимаю во-первых, где брать информацию о данных ячейки 1 в методах  createEditor или в setEditorData, а во-вторых, как узнать данные в соседней ячейке редактируемой строки.  ???

Очень прошу всех, кто может помочь!


Название: Re: Изменение состояния делегата текущей ячейки от содержимого соседней ячейки.
Отправлено: spirit от Октябрь 21, 2008, 17:05
в createEditor передается QModelIndex, через этот индекс можно достучаться к модели, а из модели можно получить данные для нужной ячейки. затем, в делегате есть метод setModelData в которые передается модель из которой так же можно получить/установить значение.  :)


Название: Re: Изменение состояния делегата текущей ячейки от содержимого соседней ячейки.
Отправлено: Ncs от Октябрь 23, 2008, 21:45
Спасибо, spirit!

Вы натолкнули на правильный ход мыслей, реализовал все в createEditor(). Похоже, чтобы полностью понять, как работают делегаты, надо научится писать собственные модели с "0".

Если кому-то интересно:

Код:
QWidget * DDD::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if(index.column() == DDColumn)
{
QComboBox *editor = new QComboBox(parent);
QStringList lst1, lst2, lst3;

int row = index.row();
int col = index.column() - 1;

const QAbstractItemModel *model = index.model();

QString str;

                QModelIndex ind = model->index(row, col);
str = model->data(ind, Qt::DisplayRole).toString();
lst1 << "Integer" << "Double" << "String";
lst2 << "str1" << "str2" << "str3";
lst3 << "a" << "b" << "c";


if (str == "int")
editor->addItems(lst1);
if (str == "double")
editor->addItems(lst2);
if (str == "str")
editor->addItems(lst3);

connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor()));
return editor;
}
else {
return QItemDelegate::createEditor(parent, option, index);
}
}