QTextEdit:在PyQt4中用undo()覆盖Ctrl-Z

时间:2013-08-02 09:42:22

标签: python qt pyqt undo

我继承了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,它会被撤消编辑,但不会调用“撤消”功能。那么它如何运作呢?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

啊,除了我在第二堂课中的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

但现在我不能再输入我的短信了!我该如何解决这个问题?

- >的解决即可。见Properly handling a keyPressEvent in a Subclassed PyQT LineEdit