Qt自动完成QTableView中QCombobox的问题

9
我有一个QTableView,其中包含一个带有QComboBox QItemDelegate的列。该组合框有一个完成列表。当您开始输入并按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

我没有捕获任何Tab输入事件,因此我不确定出现了什么问题。可能是什么原因?

3个回答

4
看起来很像QTableView正确处理Tab键,以触发单元格之间的导航,但自动完成程序没有收到它。当然,commitData发生,代理正常工作,但是自动完成程序没有提供正确的值给编辑器。

快速简单的解决方案可以是为tableView设置setTabKeyNavigation(false)。过滤Tab键事件也可能有效。最后,你可以实现focusOutEvent,这意味着在其中检查currentCompletion(),可能有点棘手。

至少,这是乍一看的样子。


3
这是我的逐步实施方法。
步骤1:找到负责tab事件的widget。
当我不知道事件去了哪里时,这是我发现的一种非常有用的调试技术。在整个应用程序上设置一个事件过滤器,使用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:停止罪犯。 现在我们已经确定了罪犯(也许像MasterAler建议的那样是QTableView),也许您会意识到您真的不希望他使用此事件,也许有一种简单的方法来停用此行为。如果是这样,问题解决了。

步骤3:如果步骤2失败或您不喜欢它

通常是因为您可能希望该事件正常进行,除了您在此定义的其他功能之外。 再次使用事件过滤器。但这次是将其设置到整个应用程序上,而不仅仅是接收事件的小部件上。

所以这次,我们使用 cullprit->installEventFilter(this) ; 在您想要使用该事件的小部件的构造函数中。然后与第1步相同,可以检测事件并根据需要作出反应。 请注意,通过返回false,方法eventFilter允许事件按照自己的方式继续处理,并且也可以由其他人处理。

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


所以事件似乎被组合框本身接管了,而不是由表格视图接管。我现在正在研究如何尽可能强制完成器完成字符串。 - Eejin

0

尝试在按下 Tab 键时使用 keyPressEvent

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

试着阅读这个例子这里。可能会有用。干杯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接