-
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
-
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.
-
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
-
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;
}
-
Das hört sich gut an.
Wo muss ich denn dann das "connect" hinpacken?
Gruß,
Sven
-
Diese Funktionen werden also leer generiert und "von außen" aufgerufen, richtig?
Müssen sie blockieren, oder ist das asynchron?
Ciao,
_
-
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.
-
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,
_
-
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
-
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,
_
-
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
-
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,
_