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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox как QItemDelegate с автом. закрытием режима редактирования  (Прочитано 4762 раз)
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. Пожалуйста, подскажите, куда копать.
Записан
yoyo
Гость
« Ответ #1 : Июнь 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 у комбобоксов в таблице не наблюдается, в отличие от отдельного MyComboBox на форме  Непонимающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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