【问题标题】:Qt autocomplete QCombobox in QTableview issueQTableview问题中的Qt自动完成QCombobox
【发布时间】:2026-01-06 07:25:01
【问题描述】:

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

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

但是当我在免费的 ComboBox 上尝试此操作时,它会自动完成正确
(按tab)->

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

【问题讨论】:

    标签: c++ qt qtableview


    【解决方案1】:

    看起来很像 QTableView 处理 Tab 键,因为它应该触发单元格之间的导航,完成者没有收到它。当然,commitData 发生了,delegate 工作正常,但完成者不行,这没有为编辑器提供适当的值。

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

    至少,乍一看是这样的。

    【讨论】:

      【解决方案2】:

      这是我将如何一步一步进行的。

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

      这是一种调试技术,当我不知道事件去向时,我发现它非常有用。在整个应用程序上设置一个事件过滤器,使用qApp->installEventFilter(this); 任何小部件都可以处理这个,没关系。 然后同样的小部件将 eventFilter(QObject* seen, 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 步:阻止罪魁祸首。 现在我们确定了罪魁祸首(可能是 QTableView,正如 MasterAler 所建议的那样),也许您可​​以意识到您并不真的希望他使用此事件,也许有一种简单的方法可以取消激活此行为。如果是这样,问题就解决了。

      第 3 步:第 2 步失败后,或者如果您不喜欢它

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

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

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

      【讨论】:

      • 所以事件似乎是由组合框本身而不是由 tableview 进行的。我现在正在研究如何在可能的情况下强制完成者完成字符串。
      【解决方案3】:

      按下 Tab 键时尝试使用 keyPressEvent

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

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

      【讨论】: