Was übergebe ich an closeEvent( QCloseEvent *event )



  • Hallo Forengemeinde,
    irgendwie steh ich grad auf der Leitung.
    Ich will systemweite events abfangen, dazu hab ich mehrer Threads gelesen.

    Hab mir in meine Klasse diesen Code für tests eingerichtet.

    void MyWidget::closeEvent( QCloseEvent *event )
    {
    
        fout.open( "text" , ios::app );
    
        if ( event->spontaneous () == true )
        {
            fout << "ttt"<<endl;
            fout.close();
            event->ignore();
        }
        else
        {
            fout << "fff"<<endl;
            fout.close();
            event->accept();
        }
    return;
    }
    

    aber was muss ich in der main.cpp übergeben ??

    also

    myclass->closeEvent(????);
    

    Ich weiß, eigentlich einen QCloseEvent *event, aber was wäre das zum Beispiel für einer ??

    Ich weiß leider nicht mehr weiter, bin am verzweifeln... vielleicht kann mir ja einer einen heissen Tipp geben. Danke schon mal

    Hier meine kleine Linksammlung die ich noch gefunden hab die mir weiterhelfen könnte um einen System weiten event abzufangen:

    WA_DeleteOnClose[url]
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-204909-and-highlight-is-closeevent.html

    Qt::WA_QuitOnClose

    http://www.qtforum.de/forum/viewtopic.php?t=5816&highlight=abouttoquit

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-240293-and-highlight-is-closeevent.html

    http://www.qtforum.de/forum/viewtopic.php?t=8303&highlight=abouttoquit[/url]

    Jeder schreibt irgendwie wie er es löst oder probiert, aber ich erkenne nicht was der richtige Weg ist.



  • OK OK habs geschnallt!

    Ich muss das in Main.cpp nicht aufrufen weils ein event ist... da müsst ich richtig liegen denk ich. Zumindest hat es jetzt funktioniert wenn man es in main nicht aufruft sonder nur im Header Deklariert und in der myclass.cpp definiert.

    OK funktioniert das dann mit der
    [cpp]virtual bool MainForm::winEventFilter(MSG* msg, long* result) { ..... }
    auch so ??

    Dann würd mir ein Licht im Dunkeln aufgehen... auch wenns noch klitzeklein ist : )
    probiers mal gleich ...



  • Also gleich vorne weg: Events selber aufrufen brauchst du in den seltensten Fällen! Das erledigt Qt für dich. Die meisten Events stammen vom darunter liegenden Window-System.

    Wenn du wirklich mal ein event selbst senden willst, dann kannst du das aber nicht so einfach machen, wie du dir das vorstellst, denn die ganzen *Event sinf PROTECTED-Funktionen, also von außen nicht zugänglich.
    Dafür bietet dir Qt aber 2 Funktionen an:

    void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]
    bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]

    Lies dir dazu die Doku durch.

    Das andere Problem:
    eventFilter sind nochmal eine andere Sache. Mal erst die Doku:

    http://doc.trolltech.com/4.5/qcoreapplication.html#winEventFilter schrieb:

    bool QCoreApplication::winEventFilter ( MSG * msg, long * result ) [virtual]

    The message procedure calls this function for every message received. Reimplement this function if you want to process window messages msg that are not processed by Qt. If you don't want the event to be processed by Qt, then return true and set result to the value that the window procedure should return. Otherwise return false.

    It is only directly addressed messages that are filtered. To handle system wide messages, such as messages from a registered hot key, you need to install an event filter on the event dispatcher, which is returned from QAbstractEventDispatcher::instance().

    Also es geht darum, ob bestimmte events "gefressen" werden sollen, also ihren Empfänger nie erreichen! Z.B. dass bei einem keyPressEvent() bestimmte Keys nicht ankommen sollen.

    Schau mal z.B. hier ein Besipiel, was so ein eventFilter macht.



  • Vielen Dank Orakel-Joe ! Das ganze werd ich heut Abend ausprobieren und evtl. morgen meine Ergebnisse bzw. Erkenntnisse oder auch Problemchen melden.

    Heut hab ich erstmal dieses ausprobiert

    bool MyWidget::winEvent( MSG *msg , long *result )
    {
    
        switch( msg->message )
        {
    
            case WM_QUERYENDSESSION:
            {
                *result = 1;
                ofstream fout( "WM_QUERYENDSESSION.txt" , ios::app );
                fout << "WM_QUERYENDSESSION" <<endl;
                fout.close();
                return false;
    
            }
    
            case WM_ENDSESSION:
            {
                ofstream fout( "WM_ENDSESSION.txt" , ios::app );
                fout << "WM_ENDSESSION" <<endl;
                fout.close();
                msg->tagMSG
    
               //true dann shutdown
               return ( msg->wParam = false );
            }
    

    LEIDER ohne Ergebnis, nicht einmal die Textfiles wurden erstellt.

    Aber wenn ich dich jetzt richtig verstanden habe muss ich dein "Zitat" verwenden

    void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static] 
    bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]
    

    Muss ich heut Abend auch ausprobieren.

    winEventFilter wär auch ne gute Idee aber wenn ich dann mit meinem Programm runterfahren will soll der Event ja nicht mehr gefressen werden : )
    muss wohl auf die winEvent zurückgreifen. (Außer ich halt ne globale Variable Fest die mir sagt ob es von mir kommt oder vom System und dann vergleich)

    Ok bis denn mal....



  • kurzer Einwand noch!

    Eigentlich sollte er doch bei mir mindestens die TEXT.Files erstellen und schreiben oder ned ??

    bei meinem Code is noch a überbleibsl, also eine Zeile toter Code

    msg->tagMSG
    

    bitte ignorieren oder löschen


Anmelden zum Antworten