子类化 QTextEdit for keyPressEvent 覆盖是唯一的方法吗?



我正在使用PySide2构建一个Qt应用程序,该应用程序将至少有一个类似文本编辑器的视图。我想修改QTextEdit的keyPressEvent方法的功能有两个原因:

  1. 添加具有用户定义的键盘操作来操作文本的功能(例如使用 tab/shift+tab 的标准缩进/缩进,尽管还有许多其他操作(。
  2. 为了方便将来的一些功能,正在显示的文本将以完全不同的结构存储(不是HTML/RTF/等,而是树(。这让我相信我不能将 QTextEdit 用作组合的 View+Controller,而是必须在每次按键后提取控制器逻辑以正确修改底层结构,并将生成的文本提供给 QTextEdit。(虽然,我已经考虑过利用QTextEdit在引擎盖下使用HTML的事实,可能使用diva标签隐藏结构。注意如下(

鉴于Python的解释,这两者的结合 - 加上也使用QSyntaxHighlighter的愿望 - 让我感到担忧。如果每次按键都执行了大量的业务逻辑,那么它最终可能会非常引人注目。现在,我不想过早优化,但我想避免走上一条似乎不得不进行更耗时的更改的道路。我只是好奇,如果没有用C++编写 QTextEdit 子类,如果有我没有想到的其他方法可能会更高性能。

或者,如果似乎需要 QTextEdit 的 C++ 子类,则覆盖keyPressEvent是最佳方法。

注意 以下更新与将业务登录注入 QTextEdit 的输入处理(以及划分视图/控制器职责(的愿望没有直接关系,而是向与第 2 项具有类似用例的任何其他人提供信息:只是在QtDesigner中玩了一下小部件,<a>锚点和<meta>标签都无法至少"标记"结构元素, 同时对用户也不可见。(<a name="something"></a>不会随文本移动,<meta>总是移动到头部(。

您可以使用事件过滤器来处理按键,而无需子类化QTextEdit

from PySide import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.edit = QtGui.QTextEdit(self)
self.edit.installEventFilter(self)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.edit)
def eventFilter(self, widget, event):
if (event.type() == QtCore.QEvent.KeyPress and
widget is self.edit):
key = event.key()
if key == QtCore.Qt.Key_Escape:
print('escape')
else:
if key == QtCore.Qt.Key_Return:
self.edit.setText('return')
elif key == QtCore.Qt.Key_Enter:
self.edit.setText('enter')
return True
return QtGui.QWidget.eventFilter(self, widget, event)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 300, 300, 300)
window.show()
sys.exit(app.exec_())

最新更新