Qt 如何关注下一个/上一个小部件

Qt 如何关注下一个/上一个小部件,qt,Qt,我正在覆盖QPlainTextEdit,使其成为一个单行编辑小部件。换句话说,我希望它看起来像QLineEdit,但具有QPlainTextEdit的扩展功能,如文本格式等 到目前为止,我唯一的问题是,当从QPlainTextEdit派生的小部件处于焦点时,当我按Tab/Shift+Tab时,我不知道如何将焦点传递给下一个/上一个小部件。我已经开始覆盖keyPressEvent来捕获按下的Tab键,但接下来呢?如何从窗口小部件更改焦点 我只能想到太复杂的解决方案(比如向家长发出信号,说重点应该改

我正在覆盖QPlainTextEdit,使其成为一个单行编辑小部件。换句话说,我希望它看起来像QLineEdit,但具有QPlainTextEdit的扩展功能,如文本格式等

到目前为止,我唯一的问题是,当从QPlainTextEdit派生的小部件处于焦点时,当我按Tab/Shift+Tab时,我不知道如何将焦点传递给下一个/上一个小部件。我已经开始覆盖keyPressEvent来捕获按下的Tab键,但接下来呢?如何从窗口小部件更改焦点


我只能想到太复杂的解决方案(比如向家长发出信号,说重点应该改变,但这似乎是愚蠢的过激行为)。我打赌这个问题一定有一个非常简单的解决方案。

使用函数将
QPlainTextEdit
对象的
tabChangesFocus
属性设置为
true

使用函数将
QPlainTextEdit
对象的
tabChangesFocus
属性设置为
true

Ithuga接受了答案,这是最简单的方法。然而,我还发现了另一个对于没有tabChangesFocus属性的小部件可能更通用的方法。覆盖按键事件,如下所示:

def keyPressEvent(self, event):
    if event.key() == QtCore.Qt.Key_Tab:
        self.parent().focusNextChild()
    elif event.key() == QtCore.Qt.Key_Backtab:
        self.parent().focusPrevChild()

我接受了thuga的答案,这是最简单的方法。然而,我还发现了另一个对于没有tabChangesFocus属性的小部件可能更通用的方法。覆盖按键事件,如下所示:

def keyPressEvent(self, event):
    if event.key() == QtCore.Qt.Key_Tab:
        self.parent().focusNextChild()
    elif event.key() == QtCore.Qt.Key_Backtab:
        self.parent().focusPrevChild()

有两件事你可以尝试:

  • 创建
    QAction
    并将其添加到小部件中。将
    QShortcut
    设置为具有
    QKeySequence(Qt::Key_选项卡)
    的操作。将动作与更改焦点的插槽连接

  • 直接使用新的QShortcut(QKeySequence(Qt::Key_Tab)、widgetPtr、SLOT(changeFocus())

因此,现在不需要继承控件来捕获keyPressEvent。请注意,您可能需要更改快捷方式上下文,以使其与您的需求最佳匹配。

有两件事可以尝试:

  • 创建
    QAction
    并将其添加到小部件中。将
    QShortcut
    设置为具有
    QKeySequence(Qt::Key_选项卡)
    的操作。将动作与更改焦点的插槽连接

  • 直接使用新的QShortcut(QKeySequence(Qt::Key_Tab)、widgetPtr、SLOT(changeFocus())

因此,现在不需要继承控件来捕获keyPressEvent。请注意,您可能需要更改快捷方式上下文,以使其与您的要求最为匹配。

谢谢。这是难以置信的简单,它的工作。我没有注意到QPlainTextEdit中有这样的属性。谢谢。这是难以置信的简单,它的工作。我没有注意到QPlainTextEdit中有这样的属性。