Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved] How to propagate keyPressEvent on different qt QMainWindow
Forum Updated to NodeBB v4.3 + New Features

[Solved] How to propagate keyPressEvent on different qt QMainWindow

Scheduled Pinned Locked Moved General and Desktop
28 Posts 2 Posters 53.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ? This user is from outside of this forum
    ? This user is from outside of this forum
    Guest
    wrote on last edited by
    #19

    Thanks for the link earlier. I am able to pass key event to parent widget by using ignore() ...
    My code below ...

    This is MyWindow class, where on an event I open MyDialog
    @
    void MyWindow::clik()
    {
    mydial = new MyDialog(this);
    mydial->setGeometry(QRect(40,40,200,200));
    mydial->show();
    }

    void MyWindow::keyPressEvent(QKeyEvent *event)
    {
    qDebug() << "Inside MyWindow keypress";
    }
    @

    This is MyDialog class where I have a child widget MyButton
    @
    MyDialog::MyDialog(QWidget *parent) : QDialog(parent)
    {
    qDebug() << "MyDialog constructor";
    btn = new MyButton(this);
    btn->setGeometry(QRect(5,5,40,40));
    btn->show();
    }

    void MyDialog::keyPressEvent(QKeyEvent *event)
    {
    qDebug() << "Inside MyDialog keypress";
    event->ignore();
    }
    @

    This is MyButton class where I shift focus and then press a key
    @
    MyButton::MyButton(QWidget *parent) : QPushButton(parent)
    {
    qDebug() << "MyButton constructor";
    setText("Hellllo");
    }

    void MyButton::keyPressEvent(QKeyEvent *event)
    {
    qDebug() << "Inside MyButton keypress";
    event->ignore();
    }
    @

    In this code, the key event on MyButton, is successfully ignored and passed to MyDialog, output is
    Inside MyButton keypress
    Inside MyDialog keypress

    but the event does not then pass to MyWindow !!!

    Next I added another MyButton to MyWindow, and pressed a key, there and it works! Ouput is
    Inside MyButton keypress
    Inside MyWindow keypress

    To dig further, I see that QDialog has already reimplemented keyPressEvent, so I don't think the event will pass to its parent widget. But using the workaround earlier, you can explicitly pass the event to parent. Still digging further ...
    @
    void QDialog::keyPressEvent ( QKeyEvent * e ) [virtual protected]
    //Reimplemented from QWidget::keyPressEvent().
    @

    1 Reply Last reply
    0
    • S Offline
      S Offline
      stukdev
      wrote on last edited by
      #20

      Good news! Maybe there is a bug in some class that not propagate the event to the parent widget! My problem is using a QMainWindow, you have use QDialog. I try some other class to control this strange case.

      When you write
      bq. But using the workaround earlier, you can explicitly pass the event to parent.
      you refer to use this?

      @MainWindow *parentMain = (MainWindow *)this->parentWidget();
      parentMain->keyPressEvent(event);@

      bq. To dig further, I see that QDialog has already reimplemented keyPressEvent, so I don’t think the event will pass to its parent widget.

      Yes, but also QPushButton have their keyPressEvent reimplement from QWidget!

      1 Reply Last reply
      0
      • ? This user is from outside of this forum
        ? This user is from outside of this forum
        Guest
        wrote on last edited by
        #21

        I try some other class to control this strange case.

        Yes, when I tried with QListWidget and also QPushButton, it was able to propogate to the MainWindow parent widget.

        you refer to use this?
        yes, that works for you right?

        Yes, but also QPushButton have their keyPressEvent reimplement from QWidget!
        I stand corrected.

        Maybe there is a bug in some class that not propagate the event to the parent widget

        I'm not sure if this is a bug. The window flags for a Dialog and Popup make it a top-level window. I think the intended behavior is so. So you have to use the workaround you mentioned earlier.
        But, if you override the window flag of the dialog and set it to Qt::Widget, the events get propagated, but the UI behaviour of course changes. :)

        1 Reply Last reply
        0
        • S Offline
          S Offline
          stukdev
          wrote on last edited by
          #22

          bq. es, that works for you right?

          Yes, but with that workaround i call directly the function of the parent and i get to set public in a parent.

          bq. The window flags for a Dialog and Popup make it a top-level window. I think the intended behavior is so. So you have to use the workaround you mentioned earlier.
          But, if you override the window flag of the dialog and set it to Qt::Widget, the events get propagated, but the UI behaviour of course changes.

          Yes, but setting Qwidget flag deform my window form ( i try in the example posted and the result is one window that incorporate the two form!) and setting other such a QWindow or QDialog block the event.

          Maybe, there are some Qt Troll that can post their impression about this, but i think they are at Qt Developer Days :)

          1 Reply Last reply
          0
          • ? This user is from outside of this forum
            ? This user is from outside of this forum
            Guest
            wrote on last edited by
            #23

            yes now even i'm curious to know what they'd say :)

            1 Reply Last reply
            0
            • S Offline
              S Offline
              stukdev
              wrote on last edited by
              #24

              Well, after few days i think that QMainWindow is a top windows,for me QMainWindow is a event end, and maybe this is the problem because the event is not propagate!
              Maybe there are some class such as QMainWindow,QDialog ecc.. that prevent the propagation of the event.

              If i want propagate the event i have to create an eventFilter on a parentWidget, and install it on a children. See "doc":http://doc.qt.nokia.com/4.7/eventsandfilters.html#event-filters

              Now the code of the example is this:

              //In the parent
              @bool MainWindow::eventFilter(QObject *object, QEvent *event)
              {
              if (object == form && event->type() == QEvent::KeyPress)
              {
              QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
              qDebug() << "event from children";
              MainWindow::keyPressEvent(keyEvent); //Use the event in parent using its keyPressEvent()
              return QObject::eventFilter(object, event);
              }

               return QObject::eventFilter(object, event);
              

              }
              @

              //Children
              @test::test(QWidget *parent) : QMainWindow(parent), ui(new Ui::test)
              {
              ui->setupUi(this);

              this->setWindowFlags(Qt::Dialog);
              this->installEventFilter(parent); //Installing the filter
              

              }@

              This is not very easy but clean, and work :)

              But now qt developer days are end and i want a comment of a qt troll about this long post :)

              1 Reply Last reply
              0
              • ? This user is from outside of this forum
                ? This user is from outside of this forum
                Guest
                wrote on last edited by
                #25

                yes this is definitely cleaner :) thanks for the post

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  thierry
                  wrote on last edited by
                  #26

                  Hello all,

                  Indeed the events are propagated to the parent but it stops to the top level parent (ie. the window). This is to make sure that all events get sensibly propagated tovisual parents.
                  So if you want to propagate a key event from on main window to another one, you'll have to do it manually.

                  1 Reply Last reply
                  0
                  • ? This user is from outside of this forum
                    ? This user is from outside of this forum
                    Guest
                    wrote on last edited by
                    #27

                    thanks for the clarification Thierry :)

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      stukdev
                      wrote on last edited by
                      #28

                      bq. Hello all,
                      Indeed the events are propagated to the parent but it stops to the top level parent (ie. the window). This is to make sure that all events get sensibly propagated tovisual parents.
                      So if you want to propagate a key event from on main window to another one, you’ll have to do it manually.

                      Thank's thierry, this tips is in the documentation of qt?

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved