QTableview 问题中的 Qt 自动完成 QCombobox

Qt autocomplete QCombobox in QTableview issue

我有一个 QTableView,其中有一列带有 QComboBox QItemDelegate。有一个组合框的完成列表。当您开始输入并按回车键时,完成就正确了(注意大写字母)
(按回车键)->

但是当我按 Tab 键时,它没有完成包含大写字母。
(按 Tab 键)->

但是当我在免费的 ComboBox 上尝试这个时,它会正确地自动完成
(按 Tab 键)->

我没有在任何地方捕获 Tab 输入事件,所以我不确定是什么导致了这个问题。可能是什么?

尝试在按下 Tab 键时使用 keyPressEvent

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

尝试阅读此示例 here。可能有用。干杯

看起来非常像 QTableView 按原样处理 Tab 键——触发单元格之间的导航,完成者没有收到它。当然,commitData 发生了,委托工作正常,但不是完成者,在这种情况下没有为编辑器提供正确的值。

tableView 的快速简便的解决方案可能是 setTabKeyNavigation(false)。 过滤选项卡键事件也可以。最后,您可以实现 focusOutEvent,这意味着在其中检查 currentCompletion(),这可能有点棘手。

至少,乍一看是这样的。

以下是我将如何逐步进行。

第 1 步:发现哪个小部件接收选项卡事件。

这是一种调试技术,当我不知道事件发生在哪里时,我发现它非常有用。在整个应用程序上设置一个事件过滤器,qApp->installEventFilter(this); 任何小部件都可以处理这个,没关系。 这个相同的小部件然后重新实现 eventFilter(QObject* watched, QEvent *event) 为:

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 所建议的那样),也许您会意识到您并不是真的希望他使用此事件,并且也许有一种简单的方法可以取消激活此行为。如果是这样,问题就解决了。

第三步:第二步失败后,或者不喜欢

通常是因为除了您在此处定义的附加功能之外,您可能希望活动正常进行。 (再次)使用事件过滤器。但这次是在整个应用程序上设置,只是在接收事件的小部件上。

所以这一次,我们使用 cullprit->installEventFilter(this) ; 而不是 qApp 在要在其中使用事件的小部件的构造函数中。然后与步骤 1 相同,您可以检测事件并做出相应的反应。 请注意,通过返回 false,eventFilter 方法允许事件按照他的快乐方式进行,并由其他人处理。

注意:将事件过滤器保留在整个应用程序上可能不是一个好主意,它会浪费整个事件系统组织的目的。我认为最好将步骤 1 保留到调试阶段。