Signal Slot bei unbekannter Instanz?

Alles rund um die Programmierung mit Qt
Antworten
lespaul
Beiträge: 87
Registriert: 11. August 2011 10:07

Signal Slot bei unbekannter Instanz?

Beitrag von lespaul »

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!
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: Signal Slot bei unbekannter Instanz?

Beitrag von nebler »

Mögliche Lösung 1 (unschön):
Beim Signal ein Rückgabewert einbauen.

Code: Alles auswählen

mySignal( QString& result );
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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Signal Slot bei unbekannter Instanz?

Beitrag von Christian81 »

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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Signal Slot bei unbekannter Instanz?

Beitrag von solarix »

lespaul 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...
über
* 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...?
Christian81 hat geschrieben: Ein Signal kann keine Referenz haben..
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).
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: Signal Slot bei unbekannter Instanz?

Beitrag von nebler »

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;
};
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Signal Slot bei unbekannter Instanz?

Beitrag von Christian81 »

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
lespaul
Beiträge: 87
Registriert: 11. August 2011 10:07

Re: Signal Slot bei unbekannter Instanz?

Beitrag von lespaul »

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?
nebler hat geschrieben:Ein Interface im dem Projekt definieren und mit Hilfe des Widget-Baums die Klasse finden, die dieses Interface erfüllt.
Mithilfe des Widget Baums die Klasse finden? EIn Interface in B oder TesSignalSlot?

Ich danke für eure Hilfen.

Gruß Lespaul
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: Signal Slot bei unbekannter Instanz?

Beitrag von nebler »

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?
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.
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.
lespaul hat geschrieben:
nebler hat geschrieben:Ein Interface im dem Projekt definieren und mit Hilfe des Widget-Baums die Klasse finden, die dieses Interface erfüllt.
Mithilfe des Widget Baums die Klasse finden? EIn Interface in B oder TesSignalSlot?
URL:
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; }
}
Antworten