mal wieder Signal Slot Problem!

Alles rund um die Programmierung mit Qt
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

"config += console" brachte nicht im Sinne von das ich im Konsolenfenster von Eclipse keine Ausgabe hatte!

Die Klassen zu posen ist nicht so einfach, ich habe sie mit rational rose erstellt und muss der Übersichtlichkeit halber einiges entfernen!


meine Kasse A sieht abgespeckt so aus:
Headerdatei
class CdiClientDialogGUI : public QMainWindow
{
Q_OBJECT

CdiClientDialogGUI ();
CdiClientDialogGUI~();

public slots:
void buttonStartPressed();

};

Konstruktor meiner A:
CdiClientDialogGUI::CdiClientDialogGUI ()
{
CdiOrderPublisherFrame* tmpNewTabCOF = new CdiOrderPublisherFrame(NULL,0);

bool conOk = QObject::connect(tmpNewTabCOF, SLOT( startButtonPressed()),this, SIGNAL(buttonStartPressed()));
std::cout << "connect: "<< conOk << std::endl;

}



Header von B
class CdiOrderPublisherFrame : public CdiOrderPublisherBase {
Q_OBJECT
CdiOrderPublisherBase ();
CdiOrderPublisherBase ~();

public:
signals:
void startButtonPressed();

}

connect liefert mir immer o zurück!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

und worin liegt der Unterschied deines "Abstraktes":

Code: Alles auswählen

 bool isOK = connect(this, signal(methodeA()), b, slot(slotB())); 
und des wirklichen Codes

Code: Alles auswählen

 bool conOk = QObject::connect(tmpNewTabCOF, SLOT( startButtonPressed()),this, SIGNAL(buttonStartPressed())); 
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

Entschuldigung, habe den code schon so oft umgestellt und bin verzweifelt bei try and error angekommen:

So habe ich mir das vorgestellt:
bool conOk = QObject::connect(tmpNewTabCOF, SIGNAL( startButtonPressed()),this, SLOT(buttonStartPressed()));
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Abgesehen davon, dass
* im Konstruktor von CdiClientDialogGUI Memory-Leaks erzeugt werden
* alle Destruktoren ungueltige Prototypen haben,
* der Konstruktor fuer CdiOrderPublisherFrame(NULL,0) nicht ersichtlich ist
kann ich auf den ersten Blick nichts erkennen... kannst du vielleicht das (vermutlich kleine) Problem in Form eines Beispielprogrammes zeigen? Einfach schnell ein minimales Projekt mit den 4-5 Files erstellen und laufen lassen...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn man die Konsole schon angeschlatet hat, sollte man sie sich auch mal anschauen - wenn der Connect nicht funktioniert wird dort ausgegeben warum nicht!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

Es funktioniert,

vielen Dank an solarix.
mein Fehler lag scheinbar an der unvollständigen/fehlerhaften Deklaration:
Vielleicht hilft es ja mal jemanden daher im folgenden das Konzept:

Zusammenfassung:
Problemstellung/Voraussetzungen:
- Zwischen zwei Klassen (A und B) mittels Signal/Slot Technik eine Methode aufrufen.
- Die Klassen sind nicht verwandt
- In der einen Klasse (im Konstruktor von A) wird die andere erzeugt(B)
- Aus der Klasse B wird eine Methode aus der Klasse A aufgerufen
- Q_OBJECT nicht vergessen!


header der Klasse A
class A{
A();
A~();

public
slots:
void methodeA();
}

Header der Klasse B
class B{
B();
B~();

void machWasB();

public:
signals:
void startMethodeASignal();
}

Methode machWasB() ruft das signal und damit die Methode der Klasse A auf!
void B::machWasB()
{
emit startMethodeASignal();
}

Konstruktor der Klasse A
A::A()
{
B* b= new B;
bool conOk = QObject::connect(b, SIGNAL(startMethodeASignal()),this, SLOT(methodeA()));
}

Implementation der Metode methodeA
A::methodeA()
{
...
}
DeepDiver
Beiträge: 34
Registriert: 7. November 2007 10:10
Wohnort: Fürstenfeldbruck
Kontaktdaten:

Beitrag von DeepDiver »

Hi grisu,

Du hast in Deinem Code Beispiel Deine eigenen Regeln nicht gefolgt!
1.) Es fehlt Q_OBJECT
2.) Es fehlt die Ableitung von QObject

Des weiteren kann man den Code nur schlecht benutzen - bitte den Code-Tag benutzen.

Und was mir auch noch extrem sauer aufstößt - zu mal Du Deinen Code als Beispiel zum Nachahmen bezeichnest:
Wer kümmert sich um den dynamisch allokierten Speicher von:

Code: Alles auswählen

 B* b= new B; 
A bisserl mehr Sorgfalt bitte - dann ersparst Du Dir und anderen viele Probleme!

Viel Erfolg weiterhin!

Tom
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

Ich wollte nur das Konzept abbilden ohne dabei lauffähigen Code zu erzeugen, daher keine Destruktoren, Macros u.ä.


Daher habe ich es auch wiefolgt genannt:
"Vielleicht hilft es ja mal jemanden daher im folgenden das Konzept:"

und wann der Speicher frei gegeben wird stand für mich nicht im Fokus!


Grüsse Carsten
Antworten