PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt PostMessage



Geige123
14-07-2008, 19:28
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

Boron
14-07-2008, 19:52
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.

Geige123
14-07-2008, 20:03
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:


#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

Boron
14-07-2008, 22:00
Könnte man evtl. eine Qt-Klasse schreiben, die nichts anderes kann, als Signale an Dein Dialogfester zu senden:
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;
}

Geige123
15-07-2008, 14:26
Das hört sich gut an.

Wo muss ich denn dann das "connect" hinpacken?

Gruß,
Sven

anda_skoa
15-07-2008, 23:15
Diese Funktionen werden also leer generiert und "von außen" aufgerufen, richtig?

Müssen sie blockieren, oder ist das asynchron?

Ciao,
_

Geige123
16-07-2008, 19:42
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.

anda_skoa
17-07-2008, 13:48
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,
_

Geige123
17-07-2008, 20:09
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

anda_skoa
17-07-2008, 22:07
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::postEvent() ein eigenes Customevent an ein von dir zuvor instanziiertes Objekt/Fenster.

Ciao,
_

Geige123
20-07-2008, 20:20
Ok. Ich habe also ein neues Event definiert, und sende das mit postEvent an mein Dialogfenster.



QEvent *lichtAnEvent = new QEvent((QEvent::Type)(QEvent::User+1));

if(lit__Power == lit__PowerState__ON)QCoreApplication::postEvent(di alog, lichtAnEvent);


Wie kann ich das nun in der Dialogfenster-Klasse empfangen? Bzw. was muss ich in der event()-Funktion schreiben?

Gruß,
geige123

anda_skoa
21-07-2008, 12:51
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,
_