Important: Please read the Qt Code of Conduct -

Accessing MainWindow Actions through shortcuts from a QDialog (modeless)

  • Hi,

    I have an action with a keyboard shortcut in my main window that starts a processing operation. But now I made a QDialog that pops up when a button is pressed, and in that dialog I set the value that the processing operation in the main window needs. So for this I made the dialog modeless but while I'm on the dialog the keyboard shortcuts of the mainwindow don't work until I actually click on the mainwindow again. Since I vary the parameter in the QDialog I would like to not need to always click on the mainwindow after setting a value in the dialog to start a "process".

    I tried doing:

    processAction = new QAction(this)

    myDialog = new QDialog(this)

    But this didn't work. Is there a way to do this with dialogs??

  • Hello Sergex,
    I tried to do something like this some time ago but in fact if the action is not used (for example in a toolBar or menu) is like it isn't activated, and does nothing. You can define a function inside the QDialog which manages QKeyEvents. You should re-implement the virtual function: @void keyPressEvent(QKeyEvent *);@ inside your QDialog. Then you can chose what to do when a certain key is pressed. For example:
    @void YourDialog::keyPressEvent(QKeyEvent *event) {
    if(event->key() == Qt::Key_3) { //your key
    }@ Hope this helps.

  • Could you simply automatically reactivate the main window after showing the dialog, or is it important that the dialog be selected?

  • Did you try to create a [[Doc:QShortcut]] and set the shortcutContext to Qt::ApplicationShortcut?

  • Thanks for the suggestions!

    I tried this and I ran into a very strange behavior that I don't know how to resolve. I reimplemented the keyPressEvent of my dialog class precisely how you said and for some reason I noticed that the event never gets reached when I press any keys except the Shift, control or alt keys.
    I simply put a debug line like this:

    void myDialog::keyPressEvent(QKeyEvent *event) {
    qDebug("Key Press Event Reached")
    if(event->key() == Qt::Key_3) {

    and I never get "Key Press Event Reached" by pressing keys unless I press any of the modifiers..

    Yes, I tried your suggestion, I don't know if I'm doing something wrong but it didn't work for me.
    I did in my dialog class:

    myShortcut = new QShortcut(this);
    myShortcut->setKey(Qt::Key_Space); //Or any other non modifier key
    connect(myShortCut, SIGNAL(activated()), this, SLOT(handleShortCutSlot()));
    The handling slot is never entered in this case.

    I would really appreciate any further tips!


  • The snippet works for me.

    But watch out! If you're in a text or line edit or any other widget that takes the space key for any action, the shortcut will not trigger!

Log in to reply