Название: QComboBox как QItemDelegate с автом. закрытием режима редактирования
Отправлено: yoyo от Июнь 16, 2009, 08:29
Использую QComboBox в качестве редактора записей таблицы QWidget *MyDelegate::createEditor(...) const { ... MyComboBox *combo = new MyComboBox(parent); ... connect(combo, SIGNAL(activated(int)), this, SLOT(commitAndClose())); return combo; }
void MyDelegate::commitAndClose() { ... MyComboBox * combo = qobject_cast<MyComboBox *>(sender()); emit commitData(cb); emit closeEditor(cb); ... }
void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { ... MyComboBox *combo = qobject_cast<MyComboBox *>(editor); combo->setCurrentIndex(index.model()->data(index).toInt()); combo->showPopup(); ... }
...
table = new QTableWidget(); ... table->setItemDelegate(new MyDelegate(table)); table->setSelectionMode(QAbstractItemView::SingleSelection); table->setTabKeyNavigation(false); table->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed); Редактор активизируется сразу раскрывая список. При выборе записи в списке (с клавиатуры - нажатием Enter или кликом мышки) ComboBox выдает сигнал activated() и слот commitAndClose() благополучно закрывает режим редактирования записей. Хочется, чтобы отмена выбора (с клавиатуры - нажатием Esc или кликом мышки вне редактора) не просто прятала список комбобокса, но и закрывала режим редактирования записей в таблице. Простая привязка "emit closeEditor" к hidePopup() или к QEvent::Hide для combo->view()->viewport() закрывает редактор, но при этом становится не возможен выбор записи, т.к. эти события происходят до activated. Не знаю к чему привязать closeEditor. Пожалуйста, подскажите, куда копать.
Название: Re: QComboBox как QItemDelegate с автом. закрытием режима редактирования
Отправлено: yoyo от Июнь 17, 2009, 10:11
Решил изменением EventFilter: MyComboBox::MyComboBox(QWidget *parent) : QComboBox(parent) { view()->installEventFilter(this); view()->viewport()->installEventFilter(this); }
MyComboBox::~MyComboBox() { hidePopup(); }
bool MyComboBox::eventFilter(QObject* object, QEvent* event) { if (object == view()) { switch (event->type()) { //case QEvent::KeyPress: case QEvent::ShortcutOverride: switch (static_cast<QKeyEvent*>(event)->key()) { case Qt::Key_Enter: case Qt::Key_Return: setCurrentIndex(view()->currentIndex().row()); emit myActivated(currentIndex()); return false; } break;
case QEvent::FocusOut: emit myHideView(); return false; } } else if (object == view()->viewport() && event->type() == QEvent::MouseButtonRelease) { QMouseEvent *m = static_cast<QMouseEvent *>(event); if (view()->rect().contains(m->pos())) { setCurrentIndex(view()->currentIndex().row()); emit myActivated(currentIndex()); return false; } } return QComboBox::eventFilter(object, event); } Вместо стандартного сигнала activated использую свой myActivated, т.к. стандартный вызывается и когда надо и когда не надо, отчего выбор записи глючит. В делегате сигнал myActivated привязал к commitAndClose, а сигнал myHideView к обработчику сигнала closeEditor. Кстати, глюк, описанный в посте http://www.prog.org.ru/topic_9697_0.html (http://www.prog.org.ru/topic_9697_0.html) у комбобоксов в таблице не наблюдается, в отличие от отдельного MyComboBox на форме ???
|