我有一个QTableView,其中有一列带有QComboBox QItemDelegate。组合框有一个完成列表。当您开始输入内容并按Enter键时,输入正确完成(请注意大写字母)
(按Enter)->
但是当我按Tab时,它并没有包括大写字母。
(按标签)->
但是当我在免费的ComboBox上尝试该功能时,它会正确自动完成
(按标签)->
我没有在任何地方捕获Tab输入事件,所以我不确定是什么引起了该问题。会是什么?
答案 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。可能有用。干杯