Russian Qt Forum

Qt => Model-View (MV) => Тема начата: NetWorm от Октябрь 09, 2011, 09:05



Название: Как обработать событие Делегата?
Отправлено: NetWorm от Октябрь 09, 2011, 09:05
Есть делегат.....
Код
BoxDelegate::BoxDelegate(QList< QPair<QString,QString> > &aValues, QObject *parent)
   :QItemDelegate(parent){
   Value = aValues;
}
 
BoxDelegate::~BoxDelegate(){
}
 
QWidget *BoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const{
 
   QComboBox *editor = new QComboBox(parent);
 
   QList< QPair<QString,QString> >::const_iterator it=Value.begin();
   while (it != Value.end())
   {
       const QPair <QString,QString> aPair = *it;
       editor->addItem(aPair.first,aPair.second);
       ++it;
   }
   return editor;
}
void BoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{
   QComboBox *ComboBox = static_cast<QComboBox*>(editor);
   int value = index.model()->data(index, Qt::DisplayRole).toInt();
   ComboBox->setCurrentIndex(ComboBox->findData(value));
   }
 
void BoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{
   QComboBox *ComboBox = static_cast<QComboBox*>(editor);
   QVariant value = ComboBox->itemData(ComboBox->currentIndex()).toInt();
   model->setData(index, value, Qt::EditRole);
}
 
void BoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const{
   editor->setGeometry(option.rect);
}
 

Затем я его присваиваю таблице

Код
BoxDelegate *box = new BoxDelegate(aValues);
 
ui->sprTable->setItemDelegateForColumn(3,Box);
 

Все нормально при начале редактирования появляется КомбоБокс... Но когда я выбираю значение из комбобокса, для того чтобы они принялись надо нажимать Enter а как мне сделать чтоб это вызвалось автоматически... Например срабатывал сигнал dataChanged????


Название: Re: Как обработать событие Делегата?
Отправлено: asvil от Октябрь 09, 2011, 10:22
слот в делегат currentIndexChanged ( int index ).
затем в createEditor

connect(editor, SIGNAL(), this, SLOT());

затем в слоте currentIndexChanged ( int index )

Код:
QWidget *editor = qobject_cast<QWidget*>(sender());
emit closeEditor ( editor, QAbstractItemDelegate::EndEditHint hint = NoHint );
emit commitData ( editor );


Название: Re: Как обработать событие Делегата?
Отправлено: NetWorm от Октябрь 09, 2011, 11:01
Так Это понятно!!! Но он не хочет принимать данные в результирующей таблице... т.е. он в ячейке показывает значение то которое нужно, но если не нажать Enter то он его не зафиксирует в самой БД


Название: Re: Как обработать событие Делегата?
Отправлено: asvil от Октябрь 09, 2011, 11:07
где-то надо сделать submit или submitAll();


Название: Re: Как обработать событие Делегата?
Отправлено: NetWorm от Октябрь 09, 2011, 13:39
Благодарю!!!! Помогло!!!!