Qt overrides widget shortcut (window shortcut)

I have a Qt application with several window shortcuts defined in the Qt Designer form action. Shortcuts work well until they are pressed when the focus is on widgets that handle the same combination (overriding the shortcut of my window).

I would like to have the opposite behavior: window shortcuts overriding the focused widget shortcuts.

I tried to use eventFilter, and I can catch the necessary events, but I can not send them in the way global labels are called. I could use a large switch and call actions myself, but, of course, I would like to avoid this.

I used postEventboth sendEventinternally eventFilter, using MainWindowas the receiver, but events are ignored:

bool MainWindow::eventFilter(QObject*, QEvent* event) {
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
        if (keyEvent->key() == Qt::Key_Z
            && keyEvent->modifiers() == Qt::ControlModifier) {
            //Calling the triggers directly works
            ui->actionUndo->trigger();
            return true;
        } else if (keyEvent->modifiers().testFlag(
                       Qt::KeypadModifier)) {
            QKeyEvent* ev2
                = new QKeyEvent(keyEvent->type(), keyEvent->key(), 0);
            qDebug() << keyEvent << ev2;
            //This sendEvent doesn't work
            QApplication::sendEvent(ui->widget, ev2);
            event->accept();
            return true;
        } else {
            return false;
        }
    }
    return false;
}
+4
1

QEvent:: ShortcutOverride :

QEvent:: ShortcutOverride . ignore() . , .

, - , . :

Qt lineEdit Ctrl + V ( lineEdit).

:

1. , (return true) ( MainWindow::eventFilter , ). , Qt docs accept()/ignore(), , , true/false.

2. p.1 , , .

3. Ctrl + V . "Hello from window shortcut!" - (Ctrl + V) lineEdit.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->installEventFilter(this);
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::ShortcutOverride) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
        // Ignore only the Ctrl + V shortcut override, you can customize check for your needs
        if (keyEvent->modifiers().testFlag(Qt::ControlModifier) && keyEvent->key() == 'V') {
            qDebug() << "Ignoring" << keyEvent->modifiers() << "+" << (char)keyEvent->key() << "for" << watched;
            event->ignore();
            return true;
        }
    }

    return QMainWindow::eventFilter(watched, event);
}

void MainWindow::on_action1_triggered()
{
    qDebug() << "Hello from window shortcut!";
}

:

QFlags (ControlModifier) ​​+ V QLineEdit (0x575b10, name = "lineEdit" )

!

. , , .

:. - .

Ctrl-Z ( Undo in edit) Ctrl-V ( ):

- Ctrl-Z Ctrl-V:

  • QLineEdit QKeyEvent (ShortcutOverride, Key_Control, ControlModifier) ​​
  • QLineEdit QKeyEvent (KeyPress, Key_Control, ControlModifier) ​​
  • MainWindow QKeyEvent (KeyPress, Key_Control, ControlModifier) ​​
  • QLineEdit QKeyEvent (ShortcutOverride, Key_Z, ControlModifier) ​​

II - ...

Ctrl-Z - lineEdit Ctrl + Z KeyPress, :

  • QLineEdit QKeyEvent (KeyPress, Key_Z, ControlModifier) ​​

    MainWindow , Ctrl + Z , QLineEdit

Ctrl-V - MainWindow Ctrl + V ShortcutOverride, QLineEdit:

  • "Ctrl + V" QLineEdit filterEvent
  • MainWindow QKeyEvent (ShortcutOverride, Key_V, ControlModifier) ​​
  • " !" .

    QLineEdit , ShortcutOverride, MainWindow

III - Ctrl-Z Ctrl-V - :

  • QLineEdit QKeyEvent (KeyRelease, Key_Z, ControlModifier) ​​
  • MainWindow QKeyEvent (KeyRelease, Key_Z, ControlModifier) ​​
  • QLineEdit QKeyEvent (KeyRelease, Key_Control)
  • MainWindow QKeyEvent (KeyRelease, Key_Control)

P.S. , , , :)

+2

Source: https://habr.com/ru/post/1680758/


All Articles