Signal Slot bei unbekannter Instanz?
Signal Slot bei unbekannter Instanz?
Hallo,
ich habe zwei Klassen in unterschiedlichen Projekten. Die erste Klasse erschafft eine Instanz der zweiten Klasse.
Nun möchte ich aus der zweiten Klasse auf ein Ereignis reagieren, und mittels SIGNAL/SLOT mechanismus das Ergebnis der ersten Klasse mitteilen..
Wie? Ich habe ja von der zweiten Klasse keinen Bezug zur ersten...
Ich danke!
ich habe zwei Klassen in unterschiedlichen Projekten. Die erste Klasse erschafft eine Instanz der zweiten Klasse.
Nun möchte ich aus der zweiten Klasse auf ein Ereignis reagieren, und mittels SIGNAL/SLOT mechanismus das Ergebnis der ersten Klasse mitteilen..
Wie? Ich habe ja von der zweiten Klasse keinen Bezug zur ersten...
Ich danke!
Re: Signal Slot bei unbekannter Instanz?
Mögliche Lösung 1 (unschön):
Beim Signal ein Rückgabewert einbauen.
Mögliche Lösung 2:
Ein Interface im dem Projekt definieren und mit Hilfe des Widget-Baums die Klasse finden, die dieses Interface erfüllt.
Beim Signal ein Rückgabewert einbauen.
Code: Alles auswählen
mySignal( QString& result );
Ein Interface im dem Projekt definieren und mit Hilfe des Widget-Baums die Klasse finden, die dieses Interface erfüllt.
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Signal Slot bei unbekannter Instanz?
Ein Signal kann keine Referenz haben...
Es kann gar nicht sein das die eine Instanz nichts von der anderen weiß aber trotzdem Daten ausgetauscht werden soll. Wie soll das logisch gehen?
Es kann gar nicht sein das die eine Instanz nichts von der anderen weiß aber trotzdem Daten ausgetauscht werden soll. Wie soll das logisch gehen?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: Signal Slot bei unbekannter Instanz?
überlespaul hat geschrieben: Nun möchte ich aus der zweiten Klasse auf ein Ereignis reagieren, und mittels SIGNAL/SLOT mechanismus das Ergebnis der ersten Klasse mitteilen..
Wie? Ich habe ja von der zweiten Klasse keinen Bezug zur ersten...
* ein Slot in der ersten Klasse
* ein Signal in der zweiten Klasse (welche nichts von der ersten kennt)
* und ein connect-Aufruf in der ersten Klasse
Das ist im Grunde doch einfach "der Normalfall".. z.B. die Anwendung des "QTimer"s.. oder verstehe ich was falsch...?
Doch, kann es. Aber es ist unschön weil es Limitierungen gibt: Nicht-Const-Referenzen gehen nur über DirectConnections. Bei Const-Referenzen über QueuedConnections (z.B. Threads) wird das Objekt halt kopiert (da geht dann der Vorteil der Referenzen verloren).Christian81 hat geschrieben: Ein Signal kann keine Referenz haben..
Re: Signal Slot bei unbekannter Instanz?
Dem habe ich nichts hinzuzufügen, außer mein Beispielcode:
Code: Alles auswählen
#include <QtGui/QMainWindow>
#include "ui_testsignalslot.h"
class A : public QObject {
Q_OBJECT
public slots:
void mySlot( QString& result ) { result = "Yeah, thats the result!"; }
};
class B : public QObject {
Q_OBJECT
public:
void exec() {
_txt = "What is the result?";
emit mySignal( _txt );
// txt now contains 'Yeah, thats the result!'
}
QString txt() const { return _txt; }
signals:
void mySignal( QString& result );
private:
QString _txt;
};
class TestSignalSlot : public QMainWindow
{
Q_OBJECT
public:
TestSignalSlot(QWidget *parent = 0, Qt::WFlags flags = 0) {
A a;
B b;
connect( &b, SIGNAL( mySignal( QString& ) ), &a, SLOT( mySlot( QString& ) ) );
b.exec();
QString t = b.txt();
}
~TestSignalSlot() {}
private:
Ui::TestSignalSlotClass ui;
};
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Signal Slot bei unbekannter Instanz?
Nur weil es geht heißt es nicht dass es auch erlaubt ist. Sobald die Connection keine DirectConnection ist geht es nicht. Und da man dies nicht wirklich beeinflussen kann (Threads, jemand anderes der die Lib benutzt) ... naja.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: Signal Slot bei unbekannter Instanz?
Vielen Dank für eure Hilfen Leute. Ja der Code von nebler gefällt mir und liest sich auch ganz einleuchtend.
Implementiert hab eich es schon. Nun habe ich folgendes Problem:
==> Klasse A und TestSignalSlot sind in ein und demselben VS-Projekt.
==> Klasse B ist in einem anderen Projekt, allerdings allesamt in der selben Solution. Alle diese Projekte sind als shared lib (dll) kompiliert.
EIne Instanz der Klasse A in der Klasse TestSigSlot istja kein Problem. Wie könnte ich elegant ein Objekt B im TestSigSlot erzeugen?
Ich danke für eure Hilfen.
Gruß Lespaul
Implementiert hab eich es schon. Nun habe ich folgendes Problem:
==> Klasse A und TestSignalSlot sind in ein und demselben VS-Projekt.
==> Klasse B ist in einem anderen Projekt, allerdings allesamt in der selben Solution. Alle diese Projekte sind als shared lib (dll) kompiliert.
EIne Instanz der Klasse A in der Klasse TestSigSlot istja kein Problem. Wie könnte ich elegant ein Objekt B im TestSigSlot erzeugen?
Mithilfe des Widget Baums die Klasse finden? EIn Interface in B oder TesSignalSlot?nebler hat geschrieben:Ein Interface im dem Projekt definieren und mit Hilfe des Widget-Baums die Klasse finden, die dieses Interface erfüllt.
Ich danke für eure Hilfen.
Gruß Lespaul
Re: Signal Slot bei unbekannter Instanz?
Wie "Christian81" und "solarix" angesprochen ist diese Lösung unschön und eher eine Notfalllösung und die aufgeführten Randbedingungen müssen dazu erfüllt sein ... es ist jedoch davon abzuraten.lespaul hat geschrieben:Vielen Dank für eure Hilfen Leute. Ja der Code von nebler gefällt mir und liest sich auch ganz einleuchtend.
Implementiert hab eich es schon. Nun habe ich folgendes Problem:
==> Klasse A und TestSignalSlot sind in ein und demselben VS-Projekt.
==> Klasse B ist in einem anderen Projekt, allerdings allesamt in der selben Solution. Alle diese Projekte sind als shared lib (dll) kompiliert.
EIne Instanz der Klasse A in der Klasse TestSigSlot istja kein Problem. Wie könnte ich elegant ein Objekt B im TestSigSlot erzeugen?
Ich verstehe Deine Frage nicht, warum willst Du bei der Lösung die Klasse B in dem Projekt von Klasse A erzeugen. Die Verbindung der beiden Objekten kann in der UI Datei erfolgen. Ich glaube diese Lösung bereitet Dir mehr Kopfschmerzen wie das es was hilft ...
Um aber generell eine Instanz vom Typ X über Projekte verteilt zu erstellen würde Dir das Entwurfsmuster "Fabrik" weiter helfen.
URL:lespaul hat geschrieben:Mithilfe des Widget Baums die Klasse finden? EIn Interface in B oder TesSignalSlot?nebler hat geschrieben:Ein Interface im dem Projekt definieren und mit Hilfe des Widget-Baums die Klasse finden, die dieses Interface erfüllt.
http://doc.qt.nokia.com/4.7/qapplicatio ... velWidgets
Pseudo Code:
Code: Alles auswählen
MyInterface* findMyClass( QWidget* parent ) {
MyInterface* my = dynamic_cast< MyInterface* >( parent );
if( my != 0 ) {
return my;
}
foreach( QWidget* w; parent->children() ) {
my = findMyClass( w );
if( my != 0 )
return my;
}
return 0;
}
////////////////////////////////////////////////
topLevelWidgets = QApplication::topLevelWidgets();
MyInterface* myInstance = 0;
foreach( QWidget* w; topLevelWidgets ) {
myInstance = findMyClass( w );
if( myInstance != 0 ) { break; }
}