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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение состояния делегата текущей ячейки от содержимого соседней ячейки.  (Прочитано 4268 раз)
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, а во-вторых, как узнать данные в соседней ячейке редактируемой строки.  Непонимающий

Очень прошу всех, кто может помочь!
Записан
spirit
Гость
« Ответ #1 : Октябрь 21, 2008, 17:05 »

в createEditor передается QModelIndex, через этот индекс можно достучаться к модели, а из модели можно получить данные для нужной ячейки. затем, в делегате есть метод setModelData в которые передается модель из которой так же можно получить/установить значение.  Улыбающийся
Записан
Ncs
Гость
« Ответ #2 : Октябрь 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);
}
}
« Последнее редактирование: Октябрь 24, 2008, 11:38 от pastor » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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