Issues with eventFilter
-
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;...
}
@ -
[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?! -
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_OBJECTpublic:
explicit QTGUI_MainWindow(QWidget *parent = 0);
~QTGUI_MainWindow();
void writeToTCOport(QByteArray dataBA);
....@ -
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? -
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 .. -
@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); ... }
@
-
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. ;)
-
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; }
};
@