mal wieder Signal Slot Problem!
"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!
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!
und worin liegt der Unterschied deines "Abstraktes":
und des wirklichen Codes
Code: Alles auswählen
bool isOK = connect(this, signal(methodeA()), b, slot(slotB()));
Code: Alles auswählen
bool conOk = QObject::connect(tmpNewTabCOF, SLOT( startButtonPressed()),this, SIGNAL(buttonStartPressed()));
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...
* 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:
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()
{
...
}
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()
{
...
}
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:
A bisserl mehr Sorgfalt bitte - dann ersparst Du Dir und anderen viele Probleme!
Viel Erfolg weiterhin!
Tom
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; Viel Erfolg weiterhin!
Tom
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
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