4

我试图在按下 tab 时完成一个完成,你会得到所有可能性的第一个完成。

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

有没有办法解决它?

4

3 回答 3

3

您是否尝试过子类QLineEdit化并拦截按键事件

或者,您可以设置一个事件过滤器

于 2012-03-22T10:25:30.203 回答
1

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

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

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

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

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

  1. 获取当前索引;
  2. 在弹出窗口中选择索引;
  3. 前进到下一行。

作为实现,这是非常微不足道的,但就我目前的目的而言,这已经足够了。这是骨架(仅用于选项卡部分,它缺少模型和其他所有内容)。

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 时,事情不能正常工作。也许您可以在上面的链接或其中的参考资源中找到解决此问题的方法。我将在接下来的几天内解决此问题并更新此答案。

于 2015-03-11T00:09:58.920 回答
1

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

于 2012-01-28T17:32:41.390 回答