Autocomplete QCompleter和Tab键

Autocomplete QCompleter和Tab键,autocomplete,qt4,qt4.7,qlineedit,Autocomplete,Qt4,Qt4.7,Qlineedit,我试图在按下tab键时完成,您将获得所有可能性的第一次完成 但是,在基于QWidget的主窗口中,按tab键将使QLineEdit失去焦点,完成弹出窗口随后隐藏 有办法解决吗 可能有一个更好的解决方案,但我想到的一个方法是将表单上所有其他小部件的焦点策略更改为不包含“tab”焦点的策略。不使用tab键的唯一选项是Qt::ClickFocus和Qt::NoFocus您是否尝试过将QLineEdit子类化并截取该键 或者,您可以设置一个。呼。我花了一些时间才弄明白:)我多次试图解决这个问题,但总是放

我试图在按下tab键时完成,您将获得所有可能性的第一次完成

但是,在基于
QWidget
的主窗口中,按tab键将使
QLineEdit
失去焦点,完成弹出窗口随后隐藏


有办法解决吗

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

您是否尝试过将
QLineEdit子类化并截取该键


或者,您可以设置一个。

呼。我花了一些时间才弄明白:)我多次试图解决这个问题,但总是放弃。现在,我挖了足够多的东西来找到答案

OP,请原谅,因为这里的代码是Python,但应该是可以理解的,并且也为C++工作。 基本上,我遇到的问题是“如何在QCompleter中选择条目”;我以前没有注意到,但是答案在

popup()
方法中。QCompleter使用模型和视图,其中包含要显示的内容

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

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

  • 获取当前索引
  • 在弹出窗口中选择索引
  • 前进到下一排
  • 作为实现,这是非常琐碎的,但就我目前的目的而言,这就足够了。这是骨架(仅用于选项卡部分,它缺少模型和其他所有内容)

    您可能需要调整/修复一些事情,但这是基本的想法

    编辑:

    详情请参阅


    有一个小问题:当按下Return键时,这些东西就不能正常工作。也许您可以在上面的链接或其中引用的参考资料中找到这个问题的解决方案。我将在未来几天内解决此问题并更新此答案。

    仍然存在问题,焦点不再转移,但按Tab键后完成对话框立即关闭。您解决了此问题吗?我正试图实现同样的目标:使用QLineEdit的子类,我成功地截取了tab键,但突出显示第一个可用的完成项对我来说仍然不起作用。@AkiRoss从未这样做过,但您可以查看QtCreator的代码。“文件选择”对话框似乎有选项卡完成功能
    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)