Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Issues with eventFilter
Forum Updated to NodeBB v4.3 + New Features

Issues with eventFilter

Scheduled Pinned Locked Moved Mobile and Embedded
21 Posts 3 Posters 11.3k 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.
  • raven-worxR Offline
    raven-worxR Offline
    raven-worx
    Moderators
    wrote on last edited by
    #9

    yes, you can subclass QApplication and reimplement "notify()":http://qt-project.org/doc/qt-4.8/qapplication.html#notify.
    This has the advantage that this gets only called once for each event and not multiple times like the event filter would do since the events will get propagated...

    --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
    If you have a question please use the forum so others can benefit from the solution in the future

    1 Reply Last reply
    0
    • McLionM Offline
      McLionM Offline
      McLion
      wrote on last edited by
      #10

      I did not really understand everything you wrote. Probably because I am not (yet) very experienced with Qt nor with C++ - I am a "C" guy.
      Sure I can dig up some more on that ... thanks anyway :)

      1 Reply Last reply
      0
      • raven-worxR Offline
        raven-worxR Offline
        raven-worx
        Moderators
        wrote on last edited by
        #11

        Code is a language every programmer understands... so here you go ;)

        @
        class MyApplication : public QApplication
        {
        public:
        MyApplication(...) : QApplication(...)
        {
        }

        virtual bool notify ( QObject * receiver, QEvent * event )
        {
                //same code like in your previous eventFilter() implementation
                if( event-should-be-filtered-out )
                      return true;
        
                 QApplication::notify(receiver,event);
        }
        

        };

        int main(int argc, char *argv[])
        {
        MyApplication program(argc, argv);
        ...
        QTGUI_MainWindow mainWin;

        ...
        }
        @

        --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
        If you have a question please use the forum so others can benefit from the solution in the future

        1 Reply Last reply
        0
        • McLionM Offline
          McLionM Offline
          McLion
          wrote on last edited by
          #12

          Thanks a million!
          It works ... and solves my issue!
          Responsiveness is back and everything works as supposed.

          Best regards (from aprox. 500 km west)

          1 Reply Last reply
          0
          • McLionM Offline
            McLionM Offline
            McLion
            wrote on last edited by
            #13

            I am extending it ... and got stuck.
            I seem not to be able to call a function that is defined in another class from notify().
            What is the correct way to do this?

            1 Reply Last reply
            0
            • raven-worxR Offline
              raven-worxR Offline
              raven-worx
              Moderators
              wrote on last edited by
              #14

              [quote author="McLion" date="1389690173"]
              I seem not to be able to call a function that is defined in another class from notify().[/quote]
              what exactly is preventing you from calling a method of another class?!

              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
              If you have a question please use the forum so others can benefit from the solution in the future

              1 Reply Last reply
              0
              • McLionM Offline
                McLionM Offline
                McLion
                wrote on last edited by
                #15

                Getting:
                @./release\moc_qtgui_mainwindow.o:moc_qtgui_mainwindow.cpp:(.text$_ZN13MyApplication6notifyEP7QObjectP6QEvent[MyApplication::notify(QObject*, QEvent*)]+0x76): undefined reference to `writeToTCOport(QByteArray)'
                collect2: ld returned 1 exit status@

                The other class:
                @class QTGUI_MainWindow : public QMainWindow
                {
                Q_OBJECT

                public:
                explicit QTGUI_MainWindow(QWidget *parent = 0);
                ~QTGUI_MainWindow();
                void writeToTCOport(QByteArray dataBA);
                ....@

                1 Reply Last reply
                0
                • raven-worxR Offline
                  raven-worxR Offline
                  raven-worx
                  Moderators
                  wrote on last edited by
                  #16

                  in that order:

                  clean your project

                  rerun qmake

                  rebuild project

                  or more likely i assume your are just calling the method without an object (your mainwindow instance) on or connecting a signal to it, right? (post the code of the call to writeToTCOport() inside the notify() implementation).

                  if the error remains:
                  Are the implementations of the QTGUI-MainWindow and MyApplication classes in the same project? Or e.g. loaded in a library?

                  --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                  If you have a question please use the forum so others can benefit from the solution in the future

                  1 Reply Last reply
                  0
                  • McLionM Offline
                    McLionM Offline
                    McLion
                    wrote on last edited by
                    #17

                    Cleaning and rebuilding did not help.

                    [quote author="raven-worx" date="1389691039"]
                    ... or more likely i assume your are just calling the method without an object (your mainwindow instance) on or connecting a signal to it, right? (post the code of the call to writeToTCOport() inside the notify() implementation).
                    [/quote]

                    I get:
                    @..\src/qtgui_mainwindow.h: In member function 'virtual bool MyApplication::notify(QObject*, QEvent*)':
                    ..\src/qtgui_mainwindow.h:86: error: cannot call member function 'void QTGUI_MainWindow::writeToTCOport(QByteArray)' without object@
                    when I call it like:
                    @QTGUI_MainWindow::writeToTCOport(sendData);@

                    And calling without QTGUI_MainWindow:: returns the error posted before.
                    I seem to miss some of the basic c ++ concepts ..

                    1 Reply Last reply
                    0
                    • raven-worxR Offline
                      raven-worxR Offline
                      raven-worx
                      Moderators
                      wrote on last edited by
                      #18

                      @error: cannot call member function 'void QTGUI_MainWindow::writeToTCOport(QByteArray)' without object@
                      says it clearly: you need an object/instance to call it on.

                      The call
                      @QTGUI_MainWindow::writeToTCOport(sendData);@
                      would be fine when you define the method "static". You can define a method static if you don't need to access object specific members within it. If that's ok in this method do it.

                      Otherwise i would suggest something like this for example:
                      @
                      class MyApplication : public QApplication
                      {
                      public:
                      MyApplication(...) : QApplication(...)
                      {
                      }

                          virtual bool notify ( QObject * receiver, QEvent * event )
                          {
                                  //same code like in your previous eventFilter() implementation
                                  if( event-should-be-filtered-out )
                                        return true;
                       
                                   if( m_MainWindow )
                                        m_MainWindow->writeToTCOport(...);
                      
                                   QApplication::notify(receiver,event);
                          }
                      
                          void setMainWindowObject(QTGUI_MainWindow* mainWin)
                          {
                                  m_MainWindow = mainWin;
                          }
                      
                      protected:
                                QPointer<QTGUI_MainWindow> m_MainWindow;
                      };
                       
                       
                      int main(int argc, char *argv[])
                      {
                          MyApplication program(argc, argv);
                      ...
                          QTGUI_MainWindow mainWin;
                          program.setMainWindowObject(&mainWin);
                      ...
                      }
                      

                      @

                      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                      If you have a question please use the forum so others can benefit from the solution in the future

                      1 Reply Last reply
                      0
                      • McLionM Offline
                        McLionM Offline
                        McLion
                        wrote on last edited by
                        #19

                        Thanks - tried the static solution. Compiles as long as the function is empty. As soon as I add port->write(); like in many other places I get back the same error.
                        Going to read your second suggestion ... as well as some C++ tutorials ;)

                        1 Reply Last reply
                        0
                        • raven-worxR Offline
                          raven-worxR Offline
                          raven-worx
                          Moderators
                          wrote on last edited by
                          #20

                          as i said:
                          [quote author="raven-worx" date="1389692609"]You can define a method static if you don't need to access object specific members within it.[/quote]

                          i guess "port" is a member of the class?

                          [quote author="McLion" date="1389697075"]
                          Going to read your second suggestion ... as well as some C++ tutorials ;)[/quote]

                          yes, good idea. ;)

                          --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                          If you have a question please use the forum so others can benefit from the solution in the future

                          1 Reply Last reply
                          0
                          • McLionM Offline
                            McLionM Offline
                            McLion
                            wrote on last edited by
                            #21

                            Need to pick this up again.
                            The following should filter all MouseEvents while !bTouchActive, i.e. the GUI is hidden in my app. With the code below, the GUI still reflects the touches and another object has the focus after the GUI is turned back on. While the GUI is inactive it currently just should debug the cursor position where it has been touched but not "react" on the GUI. Funny enough, it does change the focus to a different object but it does not execute its press/release MouseEvent.
                            What is wrong in the code below?

                            @class MyApplication : public QApplication
                            {
                            public:
                            MyApplication(int &argc, char **argv ) : QApplication(argc, argv)
                            {
                            }

                            virtual bool notify ( QObject *receiver, QEvent *event )
                            {
                              switch( event->type() )
                              {
                                case QEvent::MouseButtonPress:
                                case QEvent::MouseButtonRelease:
                                case QEvent::MouseMove:
                                case QEvent::MouseButtonDblClick:
                                {
                                  if(bTouchActive)
                                  { qDebug("Touch/Mouse event type: %d", event->type());
                                  }
                                  else
                                  { QMouseEvent *TEvent = static_cast<QMouseEvent *>(event);
                                    QPoint cursorPos = TEvent->globalPos();
                                    qDebug("TouchInActive: TouchXpos %d, TouchYpos %d", cursorPos.rx(), cursorPos.ry());
                                    return true;  // return with true filters the event
                                  }
                                  break;
                                }
                                case QEvent::KeyPress:
                                case QEvent::KeyRelease:
                                { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
                                  qDebug("Key %d pressed, Event type: %d", keyEvent->key(), event->type());
                                  break; // break does not filter and forwards the event to notify()
                                }
                                default:
                                  break;
                              }
                              QApplication::notify(receiver,event);
                              return false;
                            }
                            

                            };
                            @

                            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