2

我将 QTextEdit 子类化

class Q_My_TextEdit(QtGui.QTextEdit):
    def __init__(self, *args):
        QtGui.QTextEdit.__init__(self, *args)

    def undo(self):
        print("undo")
        #my own undo code

在我的另一堂课上:

self.textedit=Q_My_TextEdit()

def keyPressEvent(self,event):
    if event.key()==(Qt.Key_Control and Qt.Key_Z):
        self.textedit.undo()

如果您在 QTextEdit 中键入一些文本,然后按 CTRL-Z,它会被撤消,但不会调用函数“撤消”。那么它具体是如何工作的呢?

背景是,在第二步中,我想设置新文本(setText()),因此删除了撤消堆栈。我已经运行了可以自行撤消的代码,但我无法在 CTRL-Z 上触发它,因为使用“Z”键快捷键以某种方式被保留。例如,如果我用 调用我自己的撤消event.key()==(Qt.Key_Control and Qt.Key_Y),它可以工作。

4

2 回答 2

2

啊,所以除了我在第二堂课中的 keyPressEvent 之外,您还必须将它放入子类中!

class Q_My_TextEdit(QtGui.QTextEdit):
    def __init__(self, *args):
        QtGui.QTextEdit.__init__(self, *args)

    def keyPressEvent(self,event):
        if event.key()==(Qt.Key_Control and Qt.Key_Z):
            self.undo()
        #To get the remaining functionality back (e.g. without this, typing would not work):
        QTextEdit.keyPressEvent(self,event)

    def undo(self):
        print("undo")
        #my own undo code

但现在我不能再输入我的文本编辑器了!我该如何解决这个问题?

-->解决了。请参阅在子类 PyQT LineEdit 中正确处理 keyPressEvent

于 2013-08-02T09:53:45.480 回答
0

在 C++ 中,您必须安装一个事件过滤器,可能与 PyQt 类似(在您的编辑器类中覆盖 virtual bool eventFilter(QObject* pObject, QEvent* pEvent);)。CTRL-Z 可能被 QTextEdit 事件过滤器过滤,因此它永远不会到达 keyPressEvent。

于 2013-08-02T09:53:07.547 回答