Anzeige:
Ergebnis 1 bis 12 von 12

Thema: Qt PostMessage

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.07.2008
    Beiträge
    9

    Qt PostMessage

    Hallo,

    ich programmiere ein Client/Server-Programm (SOAP) mit Qt. Die Funktionen, die serverseitig gestartet werden, wenn eine Nachricht empfangen wird, habe ich aus einem Toolkit entnommen.
    Nun möchte ich mit diesen Funktionen gerne das Dialogfenster steuern.
    In VC++/MFC habe ich mir mit PostMessage geholfen.

    Kennt jemand eine Qt-Alternative dazu? Oder gibt es eine bessere Idee?

    Grüße,
    Geige123

  2. #2
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Wenn ich richtig verstehe was Du meinst, dann solltest du in Qt mit Signals und Slots arbeiten: http://doc.trolltech.com/4.4/signalsandslots.html.
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.07.2008
    Beiträge
    9
    Hallo,

    das Problem, das ich dabei habe, ist, dass ich ja nur die Schnittstellenfunktionen der Serversoftware implementieren kann.
    Ich komme nicht an die Klassen oder Structs ran.

    Im Original sieht das so aus:
    Code:
    #include "dpws.h"
    #include "litStub.h"
    
    int main(){
    ...
    ...
    ...}
    
    ...
    
    int __lit__Switch(struct dpws* dpws, enum lit__PowerState lit__Power)
    {
    		enum lit__PowerState * pState = (enum lit__PowerState 
    
    *)dpws_get_device_user_data(dpws);
    	*pState = lit__Power;
    
    //
    // Hier will ich eine Verbindung zum Dialogfenster herstellen!
    //
    
           return SOAP_OK;
    }
    
    int __lit__GetStatus(struct dpws* dpws, enum lit__PowerState *lit__Power)
    {
    	*lit__Power = *(enum lit__PowerState *)dpws_get_device_user_data(dpws);
    	return SOAP_OK;
    }
    
    int __lit__SetLevel(struct dpws* dpws, struct _lit__LightLevelTarget *lit__LightLevelTarget)
    {
    	return SOAP_OK;
    }
    
    int __lit__GetLevelTarget(struct dpws* dpws, short *lit__LightLevel)
    {
    	return SOAP_OK;
    }
    
    int __lit__GetLevel(struct dpws* dpws, short *lit__LightLevel)
    {
    	return SOAP_OK;
    }
    Diese Funktionen werden also automatisch erstellt (Toolkit) und bei eingehenden Anfragen ausgeführt.
    Ich kann nur in der Funktion was hinzufügen. Soweit ich das verstanden habe, kann ich da nicht mit der SIGNAL/SLOT-Technik arbeiten.

    Oder?

    Gruß,
    Sven

  4. #4
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Könnte man evtl. eine Qt-Klasse schreiben, die nichts anderes kann, als Signale an Dein Dialogfester zu senden:
    Code:
    SignalSender::sendAnEvent() {
       emit aSignalToDialogWindow();
    }
    
    int __lit__Switch(struct dpws* dpws, enum lit__PowerState lit__Power)
    {
    		enum lit__PowerState * pState = (enum lit__PowerState 
    
    *)dpws_get_device_user_data(dpws);
    	*pState = lit__Power;
    
    
           SignalSenderInstance.sendAnEvent();
           return SOAP_OK;
    }
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  5. #5
    Registrierter Benutzer
    Registriert seit
    11.07.2008
    Beiträge
    9
    Das hört sich gut an.

    Wo muss ich denn dann das "connect" hinpacken?

    Gruß,
    Sven

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Diese Funktionen werden also leer generiert und "von außen" aufgerufen, richtig?

    Müssen sie blockieren, oder ist das asynchron?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    11.07.2008
    Beiträge
    9
    Ja, das stimmt. Sie werden quasi von aussen aufgerufen.

    Die andere Frage kann ich leider nicht beantworten.
    Ich vermute, dass damit gemeint ist, ob der Rest des Programmes weiterläuft oder nicht, während eine der Funktionen aufgerufen wird.
    Ich denke es läuft asynchron. Wobei die Funktionslufzeit eigentlich immer nur ganz kurz ist.

    Ciao.
    Geändert von Geige123 (16-07-2008 um 19:51 Uhr)

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich meinte eigentlich: erwartet die Funktion, dass eine Antwort bzw. ein Ergebnis vorliegt bevor sie beendet ist, oder wird das Ergebnis, d.h. die Benutzereingabe, später über eine andere Funktion abgefragt oder überhaupt aktiv verschickt.

    D.h.

    a)
    Funktion wird aufgerufen
    Dialog wird geöffnet
    Dialog beendet
    Funktion beendet

    oder
    b)
    Funktion wird aufgerufen
    Dialog wird geöffnet
    Funktion beendet

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    11.07.2008
    Beiträge
    9
    Achso :-)

    Es soll eigentlich keine Interaktion stattfinden. Also nur ein Signal oder Event oder was auch immer an den Dialog, der dann zum Beispiel das gesendete Bild anzeigt. Oder einen gesendeten Wert grafisch darstellt.

    Gruß
    geige123

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    In so einem Fall kannst du auch einfach nur den Dialog erzeugen und mit show() anzeigen.

    Der Dialog kann sich dann zB selbst mit deleteLater() löschen.

    Oder du benutzt eine Art zentrales Objekt, z.B. ein Singleton, an dem du in diesen Funktionen Methodenaufrufen tätigst und lässt das dann Dialog erzeugen und löschen.

    Oder du schickst mit QCoreApplication:ostEvent() ein eigenes Customevent an ein von dir zuvor instanziiertes Objekt/Fenster.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer
    Registriert seit
    11.07.2008
    Beiträge
    9
    Ok. Ich habe also ein neues Event definiert, und sende das mit postEvent an mein Dialogfenster.
    Code:
    QEvent *lichtAnEvent = new QEvent((QEvent::Type)(QEvent::User+1));
    
    if(lit__Power == lit__PowerState__ON)QCoreApplication::postEvent(dialog, lichtAnEvent);
    Wie kann ich das nun in der Dialogfenster-Klasse empfangen? Bzw. was muss ich in der event()-Funktion schreiben?

    Gruß,
    geige123

  12. #12
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    in ::event() kannst du mit Hilfe des Types bzw. wenn du von QEvent ableitest mit dynamic_cast dein Event erkennen und so reagieren, wie du möchtest.

    Speziell in dem Falle, dass du mit dem Event irgendwelche Daten transportieren willst, brauchst du ohnehin eine Ableitung.

    Falls du nur den Dialog anzeigen willst, sollte das Senden eine Standardevents wie QShowEvent reichen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •