QTableview问题中的Qt自动完成QCombobox

时间:2018-08-18 13:25:48

标签: c++ qt qtableview

我有一个QTableView,其中有一列带有QComboBox QItemDelegate。组合框有一个完成列表。当您开始输入内容并按Enter键时,输入正确完成(请注意大写字母)
before enter(按Enter)-> enter image description here

但是当我按Tab时,它并没有包括大写字母。
before enter(按标签)-> enter image description here

但是当我在免费的ComboBox上尝试该功能时,它会正确自动完成
enter image description here(按标签)-> enter image description here

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

3 个答案:

答案 0 :(得分:4)

非常类似于QTableView,它应该按Tab键处理-触发单元格之间的导航,完成者没有收到它。当然,commitData发生了,委托工作正常,但完成者却没有,这在这种情况下无法为编辑器提供适当的值。

快速简便的解决方案可以是tableView的setTabKeyNavigation(false)。 过滤标签键事件也可以正常工作。最后,您可以实现focusOutEvent,这意味着检查其中的currentCompletion()可能会有些棘手。

至少,乍一看就是这样。

答案 1 :(得分:3)

这是我逐步进行的方式。

步骤1:发现哪个窗口小部件接受了制表符事件。

这是一种调试技术,当我不知道事件去向何处时,我会发现它很有用。使用qApp->installEventFilter(this);在整个应用程序上设置一个事件过滤器 任何小部件都可以处理此问题,没关系。 然后,该相同的小部件以以下方式重新实现eventFilter(Watched QObject *,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:停止罪魁祸首。 既然我们已经确定了罪魁祸首(也许是MasterTable提出的QTableView),也许您可​​以意识到自己并不真的希望他使用此事件,并且也许有一种简便的方法可以停用此行为。如果是这样,问题就解决了。

第3步:在第2步失败后,或者您是否不喜欢

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

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

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

答案 2 :(得分:0)

在按Tab键时尝试使用 keyPressEvent

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

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