QCompleter和Tab键

时间:2012-01-28 08:43:35

标签: autocomplete qt4 qt4.7 qlineedit

我在按Tab键时尝试完成,你可以第一次完成所有可能性。

但是,在基于QWidget的主窗口中,按Tab键会使QLineEdit失去焦点,之后隐藏完成弹出窗口。

有没有办法解决它?

3 个答案:

答案 0 :(得分:3)

您是否尝试了QLineEdit的子类并拦截了密钥press event

或者,您可以设置event filter

答案 1 :(得分:1)

可能有一个更好的解决方案,但我想到的是将表单上所有其他小部件的焦点策略更改为包含“tab”焦点。唯一不使用Tab键的选项是Qt::ClickFocusQt::NoFocus

答案 2 :(得分:0)

呼。我花了一些时间才弄清楚:)多次尝试解决这个问题,但总是放弃。现在,我挖得足以找到答案。

OP,请原谅我,因为这里的代码是Python,但是应该是可以理解的,也适用于C ++。

基本上,我遇到的问题是"如何在QCompleter中选择一个条目&#34 ;;我之前没有注意到,但答案是在popup()方法中。 QCompleter适用于模型和视图,其中包含要显示的内容。

您可以根据需要更改当前行,然后在模型中获取该行的索引,然后在弹出窗口中选择它。

在我的代码中,我将QLineEdit子类化,创建了一个tabPressed信号,每次按Tab键时都会发出该信号。然后,将此信号连接到执行此操作的同一类的方法:

  1. 获取当前索引;
  2. 在弹出窗口中选择索引;
  3. 前进到下一行。
  4. 作为实施,这非常简单,但就目前的目的而言,这已经足够了。这是骨架(仅适用于标签部分,它缺少模型和其他所有内容)。

    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键时,这些东西不能正常工作。也许您可以在上面的链接或其中引用的资源中找到此问题的解决方案。我将在接下来的几天内修复此问题并更新此答案。