Seite 1 von 1
Qt Alternative zu PostMessage
Verfasst: 17. Juli 2008 14:50
von geige123
Hallo,
ich versuche eine grafische Oberfläche für ein Web-Service gestütztes Programm zu schreiben.
Dazu nutze ich eine komplettes Toolkit mit fertigen Funktionen und Datentypen.
Das einzige was ich eigentlich zu tun habe, ist die Implementierung der Dialogfenster und der Funktionen, die automatisch aufgerufen werden, wenn eine Webservice-Anfrage ankommt.
Es wird also eine leere Funktion
Code: Alles auswählen
funktionX(datentyp A, datentyp B){
// mit gegebenem Namen und gegebenen Parametern
}
automatisch erstellt, aus der heraus ich ein Dialogfenster steuern will.
In MFC habe ich mir mit PostMessage geholfen, eine Qt-Alternative dazu habe ich bisher aber nicht gefunden.
Vielleicht gibt es auch andere Ideen. Ich wäre für jede Hilfestellung dankbar!
Verfasst: 17. Juli 2008 15:11
von Sephral
Was spricht gegen Signals&Slots?
Verfasst: 17. Juli 2008 19:46
von geige123
Soweit ich das verstanden hab, können Signale nur von Q_OBJECTs gesendet werden. Und die Funktionen gehören zu keinen Instanzen. Es sind im Grunde globale Funktionen, die automatisch aufgerufen werden.
Verfasst: 17. Juli 2008 20:05
von upsala
Und was spricht gegen Events?
Verfasst: 17. Juli 2008 21:41
von Christian81
Und selbst mit Signals und Slots sehe ich keine Probleme das zu realisieren. Einfach die Methoden in eine Klasse packen und fertig
Verfasst: 17. Juli 2008 22:29
von geige123
Wenn ich das richtig verstehe, soll ich dir Funktionen als Memberfunktionen in eine Klasse packen, die Funktionen dann statt über funktionsName() über Klasse.funktionsName() aufrufen, und ein connect dazu schreiben?
Ich werde es ausprobieren und darüber berichten.
Danke.
Verfasst: 18. Juli 2008 09:05
von Sephral
Du kannst auch ein ebenfalls globales QObject bauen und die Funktionsaufrufe aus den Callbacks dorthin weiterleiten. Im Qobject hast dann wieder signals.
Verfasst: 18. Juli 2008 09:25
von geige123
So hatte ich mir das ursprünglich vorgestellt.
Wie kann ich denn ein globales Q-Object deklarieren?
Verfasst: 18. Juli 2008 09:51
von Sephral
geige123 hat geschrieben:Wie kann ich denn ein globales Q-Object deklarieren?
Einfach nen Pointer auf ein selbstgebautes QObject mit den notwendigen Optionen.
Code: Alles auswählen
MyCallbackRelay* g_myObject;
void myCallback()
{
g_myObject->forwardMyCallback();
}
Verfasst: 18. Juli 2008 11:32
von RHBaum
warum ein neues, wenn es schon eines gibt ?
Hat er nicht eh schon nen globales QApplication object ? meist sogar noch selber abgeleitet ...
Ok er muesst auf seinen abgeleiteten Typ casten, wenn er seine methoden da aufrufen moechte ...
anderer weg ist,wie upsala vorgeschlagen, impliziet auf qApp referenzieren und Events nutzen,
void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]
Am ende ist alles irgendwie gleichwertig, und sicher geschmacksache. Mir wuerd aber irgendwie nen weiteres globales Object, und der cast irgendwie mehr schmerzen als den "umweg" ueber events zu gehen ...
Performance (wie oft werden die dinger aufgerufen ? ) koennt dagegen sprechen, dafuer postEvent ist sogar threadsicher, also macht nen threadwechsel da ...
Ciao ...
Verfasst: 20. Juli 2008 21:20
von geige123
Ok. Ich habe also ein neues Event definiert, und sende das mit postEvent an mein Dialogfenster.
Code: Alles auswählen
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
Verfasst: 21. Juli 2008 12:40
von RHBaum
Na das Event im DIalog abfangen ...
virtual bool QWidget::event ( QEvent * event );
ueberschreiben ....
checken, ob das dein event ist, wenn ja, am besten ne eigene funktion anspringen, wenn nein, an die abgeleitete klasse durchreichen ...
Ciao ...
Verfasst: 21. Juli 2008 16:52
von geige123
Genau das habe ich versucht.
Code: Alles auswählen
bool QT::event(QEvent *event){
if(event==lichtAnEvent)this->showLight();
return QDialog::event(event);
}
Mit der oben genannten Event-Definition. Sobald ich zum zweiten Mal die Funktion aufrufe, die postMessage enthält, gibt es eine "unhandled exception"-Meldung.
Ich weiß nicht, ob das Event überhaupt in der event()-Funktion registriert wird.
Wo kann der Fehler liegen?
Gruß,
Geige123
Verfasst: 21. Juli 2008 18:39
von upsala
Du verschickst nicht zufälligerweise das gleiche Event 2x?