Qt автозаполнение QCombobox в выпуске QTableview

У меня есть QTableView, который имеет столбец с QComboBox QItemDelegate. Существует список завершений для combobox. Когда вы начинаете печатать и нажимаете enter, завершение выполняется правильно (Обратите внимание на заглавную букву)
before enter (нажмите enter) ->enter image description here

но когда я нажимаю tab, он не завершается, чтобы включить заглавную букву.
before enter(нажмите tab) ->enter image description here

но когда я пробую это на свободном ComboBox, он делает автозаполнение правильно
enter image description here(нажмите tab) ->enter image description here

Я не захватываю событие ввода вкладки в любом месте, поэтому я не уверен, что вызывает проблему. Что бы это могло быть?

3 ответов


вот как я буду действовать, шаг за шагом.

Шаг 1: Узнайте, какой виджет принимает событие вкладки.

Это метод отладки, который я нахожу довольно полезным, когда я не знаю, куда пошло событие. Установите eventfilter для всего приложения с помощью qApp->installEventFilter(this); Любой виджет может справиться с этим, это не важно. Этот же виджет затем повторно реализовать eventFilter (QObject* наблюдал, QEvent *событие), как:

if(event->type = QEvent::KeyPress) {
 QKeyEvent *keyEvent = dynamic_cast<QKeyEvent*>(event);
 if(keyEvent->key() == Qt::Key_Tab) {
      qDebug() << "tab is intercepted by" << watched ;
 }
}
return false ;

Это должно сказать вам, что виджет перехватит ваш сигнал.

Шаг 2: остановить cullprit. Теперь, когда мы определили виновника (возможно, QTableView, как предлагает MasterAler), возможно, вы можете понять, что вы действительно не хотите, чтобы он использовал это событие, и, возможно, есть простой способ деактивировать это поведение. Если так, проблема решена.

Шаг 3. после шага 2 не удалось, или если вам не нравится

обычно, потому что вы можете захотеть, чтобы событие продолжалось нормально, на верхняя часть дополнительных функций, которые вы определяете здесь. Использовать eventfilter (снова). Но на этот раз установить на все приложение, только на виджет, который получал событие.

Итак, на этот раз вместо qApp мы используем cullprit->installEventFilter(this) ; В конструкторе виджета, в котором вы хотите использовать событие. И тогда же, как и для шага 1, Вы можете обнаружить событие и отреагировать соответствующим образом. Обратите внимание, что, возвращая false, метод eventFilter позволяет событию следовать его веселому пути и быть обработчиком И другие тоже.

Примечание: вероятно, было бы плохой идеей сохранить eventfilter во всем приложении, это будет тратить цель всей организации системы событий. Я думаю, что лучше сохранить Шаг 1 только для фазы отладки.


выглядит очень похоже на QTableView, обрабатывающий клавишу Tab, как и должно - для запуска навигации между ячейками, completer не получает его. Конечно,commitData случается, делегат работает нормально, но не полный, который не предоставляет редактору правильное значение в случае.

быстрое и простое решение может быть setTabKeyNavigation(false) для tableView. Фильтрация tab key event также может работать. И, наконец, вы можете реализовать focusOutEvent, это означало бы проверку currentCompletion() в нем и может быть немного хитрым.

по крайней мере, так это выглядит на первый взгляд.


попробуйте использовать keyPressEvent при нажатии клавиши Tab

if event.key() == QtCore.Qt.Key_Tab: 
    # autocomplete here
    pass

попробуйте прочитать этот пример здесь . Может быть полезно. Ура!--4-->