我在按Tab键时尝试完成,你可以第一次完成所有可能性。
但是,在基于QWidget
的主窗口中,按Tab键会使QLineEdit
失去焦点,之后隐藏完成弹出窗口。
有没有办法解决它?
答案 0 :(得分:3)
您是否尝试了QLineEdit
的子类并拦截了密钥press event?
或者,您可以设置event filter。
答案 1 :(得分:1)
可能有一个更好的解决方案,但我想到的是将表单上所有其他小部件的焦点策略更改为不包含“tab”焦点。唯一不使用Tab键的选项是Qt::ClickFocus
和Qt::NoFocus
。
答案 2 :(得分:0)
呼。我花了一些时间才弄清楚:)多次尝试解决这个问题,但总是放弃。现在,我挖得足以找到答案。
OP,请原谅我,因为这里的代码是Python,但是应该是可以理解的,也适用于C ++。基本上,我遇到的问题是"如何在QCompleter中选择一个条目&#34 ;;我之前没有注意到,但答案是在popup()
方法中。 QCompleter适用于模型和视图,其中包含要显示的内容。
您可以根据需要更改当前行,然后在模型中获取该行的索引,然后在弹出窗口中选择它。
在我的代码中,我将QLineEdit
子类化,创建了一个tabPressed
信号,每次按Tab键时都会发出该信号。然后,将此信号连接到执行此操作的同一类的方法:
作为实施,这非常简单,但就目前的目的而言,这已经足够了。这是骨架(仅适用于标签部分,它缺少模型和其他所有内容)。
class MyLineEdit(QLineEdit):
tabPressed = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self._compl = QCompleter()
self.tabPressed.connect(self.next_completion)
def next_completion(self):
index = self._compl.currentIndex()
self._compl.popup().setCurrentIndex(index)
start = self._compl.currentRow()
if not self._compl.setCurrentRow(start + 1):
self._compl.setCurrentRow(0)
def event(self, event):
if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab:
self.tabPressed.emit()
return True
return super().event(event)
您可能需要调整/修复一些事情,但这是基本想法。
编辑:
详见
http://www.qtcentre.org/threads/23518-How-to-change-completion-rule-of-QCompleter
有一个小问题:当按下Return键时,这些东西不能正常工作。也许您可以在上面的链接或其中引用的资源中找到此问题的解决方案。我将在接下来的几天内修复此问题并更新此答案。