Qt Alternative zu PostMessage

Alles rund um die Programmierung mit Qt
Antworten
geige123
Beiträge: 6
Registriert: 17. Juli 2008 08:48

Qt Alternative zu PostMessage

Beitrag 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!
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Was spricht gegen Signals&Slots?
geige123
Beiträge: 6
Registriert: 17. Juli 2008 08:48

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und was spricht gegen Events?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und selbst mit Signals und Slots sehe ich keine Probleme das zu realisieren. Einfach die Methoden in eine Klasse packen und fertig
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
geige123
Beiträge: 6
Registriert: 17. Juli 2008 08:48

Beitrag 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.
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Du kannst auch ein ebenfalls globales QObject bauen und die Funktionsaufrufe aus den Callbacks dorthin weiterleiten. Im Qobject hast dann wieder signals.
Zuletzt geändert von Sephral am 18. Juli 2008 09:46, insgesamt 1-mal geändert.
geige123
Beiträge: 6
Registriert: 17. Juli 2008 08:48

Beitrag von geige123 »

So hatte ich mir das ursprünglich vorgestellt.

Wie kann ich denn ein globales Q-Object deklarieren?
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag 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();
}

RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
geige123
Beiträge: 6
Registriert: 17. Juli 2008 08:48

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
geige123
Beiträge: 6
Registriert: 17. Juli 2008 08:48

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du verschickst nicht zufälligerweise das gleiche Event 2x?
Antworten