mal wieder Signal Slot Problem!

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

mal wieder Signal Slot Problem!

Beitrag von grisu1972 »

Hallo Leute,

ich habe ein Problem mit dem SignalSlot Mechanismus.
und zwar kriege ich keine Verbindung hin.

Habe zwei Klassen:
A und B;
in A wird B mit new angelegt, und verbunden, der Returnwert von connect is allerdings false!!
Was ich möchte ist das ich aus der Klasse B eine Methode der Klasse A auslösen kann.
Ich habe eine schon gesucht finde meinen Fehler aber nicht! Dahe hier die Frage!


in A.cpp
A::init()
{
B* b;
b = new B;
bool isOK = connect(this, signal(methodeA()), b, slot(slotB()));

}

in A.h
{
privat slot:
methodeA();
}

in B.h
{
public signals:
slotB();
}


Fragen:
1. ich habe nur ein connect, das ist doch richtig?
2. connect liefert mir ein false zurück, kann man das irgendwie genauer auslesen?
boandl
Beiträge: 6
Registriert: 2. Oktober 2006 17:08

Re: mal wieder Signal Slot Problem!

Beitrag von boandl »

grisu1972 hat geschrieben: bool isOK = connect(this, signal(methodeA()), b, slot(slotB()));

privat slot:
methodeA();

public signals:
slotB();
Einfach nochmal lesen was du gepostet hast. Dann sollte es klar sein ;-)
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Code: Alles auswählen

 bool isOK = connect(this, signal(methodeA()), b, slot(slotB()));
ich wuerde sagen, du kannst das nicht mal kompilieren..
2. connect liefert mir ein false zurück, kann man das irgendwie genauer auslesen?
Ja.. die Konsolenausgabe lesen...
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

Ich sehe den Fehler nicht!

macht mich wissend, bitte!!
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

oh, oh, ohhh

ich habe bei der Abstraktion einen Fehler gemacht. Funktionieren tut es allerdings nicht!
so muss es sein:
in A.cpp
A::init()
{
B* b;
b = new B;
bool isOK = connect(b, signal(signalB()), this, slot(methodeA()));

}

in A.h
{
privat slot:
methodeA();
}

in B.h
{
public signals:
signalB();
}
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Abstraktion ist ne gute Sache, aber bitte korrekt (sonst korrigieren wir nicht existierende Fehler)

Code: Alles auswählen

bool isOK = connect(b, signal(signalB()), this, slot(methodeA())); 
ist noch immer nicht kompilierbar... siehe
http://doc.trolltech.com/4.3/qobject.html#connect

Code: Alles auswählen

privat slot:
methodeA(); 
hast du das wirklich so, oder fehlt da noch return-typ (und auf Verdacht: Parameter)?
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

stimmt:
return wert ist void;
keine Parameterübergabe nur auslösen:

da es bei mir nicht funktioniert möchte ich vor allem wissen ob ich prinzipiell richtig vorgehe!
Das heist:
Ist das connect an der richtigen Stelle in der Klasse A nachdem ich eine Instanz der Klasse B erzeugt habe?

Ich habe nur einmal connect. In der Klasse B wird nur das signal deklariert und durch emit aufgerufen, stimmt das so?
boandl
Beiträge: 6
Registriert: 2. Oktober 2006 17:08

Beitrag von boandl »

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

Beitrag von grisu1972 »

An solarix:
wie geht das den
"die Konsolenausgabe lesen..."
ich kriege doch nur true oder false zurück?
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

In dem Beispiel:
http://doc.trolltech.com/4.3/signalsandslots.html
werden zwei objekte einer Klasse erzeugt, mein Problem liegt scheinbar daran, das ich verschiedene Klassen habe, dami komme ich nicht weiter (leider)!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

nein.. das Problem ist dass du die Doku nicht befolgst..
schau dir einmal
http://de.wikipedia.org/wiki/Signal-Slo ... _und_Slots
Vergleiche danach alles (!) was da rot ist mit deiner Klasse (Header-Datei).. alles was rot ist, musst du ganz genau so befolgen!!!

Mit der Konsolenaufgabe meine ich nicht den Return-Wert, sondern die Programmausgabe.. unter Unix halt in der Konsole, unter windows brauchts noch "config += console" in der Qt-Profile, damit du diese Ausgabe hast..
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

auch in dem Beispiel ist es eine Klasse von der es zwei Instanzen gibt auf die zugegriffen wird:
http://de.wikipedia.org/wiki/Signal-Slo ... _und_Slots

ich habe zwei unterschiedliche Klassen A und B:
B wird in einer Methode von A mit new angelegt und soll eine Methode von A aufrufen könne.
In A möchte ich sie mit connect verbinden.
Daher dem Header der Klasse A nur den slot deklariert
Und in Klasse B nur das Signal deklariert!

ich denke das ist richtig, oder
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

- erben deine Klassen von "QObject"?
- hast du Q_OBJECT eingetragen?
- was steht in der Konsolenausgabe?
Das hast du uns alles nocht nicht geschrieben.. niemand hier hat leider eine Kristallkugel..
grisu1972
Beiträge: 66
Registriert: 9. November 2007 16:08

Beitrag von grisu1972 »

also ich habe versuch gleich im ersten Eintrag deutlichzu machen, das ich zwei Klassen habe und ich von der einen eine Methode der anderen aufrufen möchte, ist vielleicht nicht klar formuliert gewessen, werde an mir arbeiten dies zu verbessern.

- Konsollenausgabe:
der Eintrag "config += console" ind das *.pro Datei brachte nichts
- ich verende Eclipse und QT 4.2.1
- Q_OBJECT ist in beiden drin

funktioniert denoch nicht!

ist meine Vorgehen den richtig wie ich es oben beschrieben habe:
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

grisu1972 hat geschrieben:also ich habe versuch gleich im ersten Eintrag deutlichzu machen, das ich zwei Klassen habe und ich von der einen eine Methode der anderen aufrufen möchte, ist vielleicht nicht klar formuliert gewessen, werde an mir arbeiten dies zu verbessern.
Es ist sonnenklar was du moechtest... aber du antwortest unvollstaendig (z.B. " der Eintrag "config += console" ind das *.pro Datei brachte nichts")
ist meine Vorgehen den richtig wie ich es oben beschrieben habe:
theoretisch ja, aber der Code hat x Fehler... poste doch einfach mal die beiden originalen(!) header deiner beiden Klassen, sowie die (komplette) init-Methode.
Antworten