Qt在QTableview问题中自动完成QCombobox

Eej*_*jin 9 c++ qt qtableview

我有一个QTableView,它有一个带有QComboBox QItemDelegate的列.有一个组合框的完成列表.当您开始输入并按Enter键时,完成正确完成(请注意大写字母)
在进入之前 (按回车) - > 在此输入图像描述

但是,当我按Tab键时,它不会包含大写字母.
在进入之前(按标签) - > 在此输入图像描述

但是当我在一个免费的ComboBox上尝试这个时,它会正确地自动完成
在此输入图像描述(按标签) - > 在此输入图像描述

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

And*_*ain 3

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

第 1 步:发现哪个小部件接受 Tab 事件。

当我不知道事件去了哪里时,我发现这是一种非常有用的调试技术。在整个应用程序上设置一个事件过滤器,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 ;
Run Code Online (Sandbox Code Playgroud)

这应该告诉您哪个小部件拦截了您的信号。

第二步:阻止罪魁祸首。 现在我们已经确定了罪魁祸首(可能是 QTableView,正如 MasterAler 所建议的那样),也许您可​​以意识到您并不真正希望他使用此事件,并且也许有一种简单的方法可以停用此行为。如果是这样,问题就解决了。

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

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

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

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