【问题标题】:How to focus on a next/previous widget如何专注于下一个/上一个小部件
【发布时间】:2014-05-06 15:27:22
【问题描述】:

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

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

我只能想出过于复杂的解决方案(例如向父母发出信号表明焦点应该改变,但这似乎是愚蠢的矫枉过正)。我敢打赌,这个问题一定有一个非常简单的解决方案。

【问题讨论】:

    标签: qt


    【解决方案1】:

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

    【讨论】:

    • 谢谢。这非常简单并且有效。我没有注意到 QPlainTextEdit 中有这样的属性。
    【解决方案2】:

    我接受了 thuga 的答案,这是最简单的方法。但是,我还发现了另一个对于没有 tabChangesFocus 属性的小部件可能更通用的方法。像这样覆盖 keyPressEvent:

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

    【讨论】:

      【解决方案3】:

      您可以尝试两件事:

      • 创建QAction 并将其添加到小部件。将QShortcut 设置为QKeySequence(Qt::Key_Tab) 的操作。将动作与改变焦点的槽连接起来。

      • 直接使用new QShortcut(QKeySequence(Qt::Key_Tab), widgetPtr, SLOT(changeFocus()));

      所以现在不需要继承你的控件来捕获keyPressEvent。请注意,您可能需要更改快捷方式上下文以最符合您的要求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 2017-08-17
        • 2015-06-13
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多