我试图在按下 tab 时完成一个完成,你会得到所有可能性的第一个完成。
但是,在QWidget
基于 - 的主窗口中,按 tab 会使QLineEdit
焦点失去焦点,之后会隐藏完成弹出窗口。
有没有办法解决它?
我试图在按下 tab 时完成一个完成,你会得到所有可能性的第一个完成。
但是,在QWidget
基于 - 的主窗口中,按 tab 会使QLineEdit
焦点失去焦点,之后会隐藏完成弹出窗口。
有没有办法解决它?
唷。我花了一些时间才弄清楚这一点:)我多次尝试解决这个问题,但总是放弃。现在,我挖了足够多的东西来找到答案。
OP,请原谅我,因为这里的代码是 Python,但应该可以理解并且也适用于 C++。
基本上,我遇到的问题是“如何在 QCompleter 中选择一个条目”;我之前没有注意到,但答案在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 时,事情不能正常工作。也许您可以在上面的链接或其中的参考资源中找到解决此问题的方法。我将在接下来的几天内解决此问题并更新此答案。
可能有一个更好的解决方案,但想到的一个是将表单上所有其他小部件的焦点策略更改为不包括“选项卡”焦点的东西。唯一不使用 tab 键的选项是Qt::ClickFocus
和Qt::NoFocus
。