【问题标题】:How to connect textEdit widget to a function through key press event PyQt5如何通过按键事件 PyQt5 将 textEdit 小部件连接到函数
【发布时间】:2021-11-08 13:17:15
【问题描述】:

每当用户在小部件内按 Return 或 Enter 时,我都想将文本保存在 textEdit 小部件中。但我不确定如何注册用户在小部件边界内按下了特定键

.returnPressed 仅适用于 lineEdits。我曾尝试使用 keyPressEvent(),但据我所知,这是一个独立的功能,我不知道如何将它连接到文本小部件。

如果我使用的是 Tkinter,我会这样写:

entry.bind("<Return>", entry_get)

但我不知道如何在 PyQt5 中做到这一点。

【问题讨论】:

  • 使用keyPressEvent 通常是正确的选择,您能告诉我们您是如何尝试将它与minimal reproducible example 一起使用的吗?另外,在 StackOverflow 上对这里的函数做一些研究,你会看到很多相关的问题。
  • 文本编辑器是一个多行编辑器。如果使用 return/enter 来触发保存,用户将如何添加新行?也许keyboard shortcut 会是更好的解决方案?
  • @ekhumoro 一旦到达文本框的末尾,文本就会移动到下一行,就像 word 中的文本框一样
  • @musicamante 在发布此之前我进行了研究。这些都没有帮助,因为我只能找到关于 returnPressed 和实现 keyPressEvent 以对一般按键做出反应的帖子,而不是在某个小部件中。我复制了其中的一些代码并试图让它工作,但它给我留下了如此强烈的印象,即我停止了错误的方法。我想,既然这看起来应该是一件非常简单的事情,有人可以给我一个快速的答案。如果你知道,请告诉我,否则我会跳过它,因为我已经被其他的东西弄得不知所措了。
  • @temp54 不,它没有。要添加新的空白行,必须按下回车/回车,就像任何其他多行编辑器一样。

标签: python python-3.x pyqt pyqt5


【解决方案1】:

只覆盖keyPressEvent:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTextEdit


class TextEdit(QTextEdit):
    def keyPressEvent(self, event):
        super().keyPressEvent(event)
        if event.key() in (Qt.Key_Enter, Qt.Key_Return):
            print("save")


def main():
    app = QApplication([])

    w = TextEdit()
    w.show()

    app.exec_()


if __name__ == "__main__":
    main()

同样的逻辑可以应用于事件过滤器。使用 QShorcut 不是一种选择,因为它会消耗阻止 QTextEdit 添加行的事件。

【讨论】:

  • @temp54 请查看tour
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2020-06-08
相关资源
最近更新 更多