QLineEdit撤消/重做功能会干扰全局撤消/重做

时间:2013-04-17 15:30:46

标签: python qt pyside qlineedit

在我正在构建的应用程序中,我实现了一个全局撤消/重做系统,可通过常规快捷键Ctrl-Z和Ctrl-Shift-Z访问。

我也在使用具有自己的撤销/重做功能的QLineEdit字段。每当触发editFinished事件(按下输入或焦点丢失)时,都会创建一个全局撤消事件。但是,如果只键入几个字母,然后按Ctrl-Z,该字段将捕获按键,使用自己的撤消系统撤消上次编辑,然后不通过按键。

我想要实现的是:

  1. 当QLineEdit具有焦点且按下Ctrl-Z但是QLineEdit中没有要撤消的编辑(当undoAvailable()为False时)我希望小部件忽略按键并将其传递给致其父母。

  2. 当撤消可用且用户在窗口小部件有焦点时调用全局撤消/重做操作(IE按下工具栏上的按钮),我希望它们能够通过这个小部件。

  3. 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

从你的标签,我猜你使用Python包装器来Qt。我的例子有C ++代码,但仍应该适用于Qt的Python版本,如果你正在使用它。

看起来QObject :: eventFilter可能正在寻找您正在寻找的东西。您需要使用eventFilter(QObject * sender,QEvent * event)作为成员创建一个类。对于您想要跟踪的每个QLineEdit,执行类似'myLineEdit-> setEventFilter(eventFilterClassInstance);'

的操作

这允许您拦截已安装事件过滤器的每个对象的所有QEvent。您可以在多个对象上安装事件过滤器,然后通过设置它们的QObject开始过滤。最重要的是,如果您希望事件正常处理,则可以从eventFilter返回true;如果不应该看到该事件,则可以返回false。

由于您对进行撤消/重做感兴趣,可以执行isUndoAvailable()来检查是否存在。

代码可能是这样的:

MyEventFilterClass::eventFilter(QObject *object, QEvent *event)
{
    if (object == someLineEdit) {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

            int key = keyEvent->key();
            int mods = keyEvent->modifiers();
            if (mods == Qt::ShiftModifier && key == Qt::Key_Z) {
                if (someLineEdit->undoAvailable()) {
                    someLineEdit->undo();
                    return true;
                }
                else {
                    /* There are a few options here: */
                    /* If you have a list of known parents, you could iter over them, and pick the right one. */
                    /* Or maybe you want the event filter to emit a signal for the parents to see. */
                    return true;
                }
            }
        }
    }
}

对于第二部分,您可以使用QApplication :: focusWidget来查看当前具有焦点的内容(尽管我还没有测试过)。我有一个主窗口,它查看两个可能的窗口以确定哪个窗口具有焦点,并将撤消操作应用于具有焦点的窗口。

我意识到你的问题很老了,但我希望这会有所帮助。