MySubWindow

Du bist neu in der Welt von C++? Dann schau hier herein!
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

MySubWindow

Beitrag von janmerkschien »

hey,
ich habe meine eigene Klasse von QMdiSubWindow abgeleitet. (MySubWindow)
jetzt wird in der abgeleiteten Klasse beim verändern der größe des SubWindows ein int Wert erzeugt.
dieser Wert müsste an das Widget des SubWindows übergeben werden.
Eigentlich würde man ja dann dem SubWindow beim aufruf das Widget übergeben . . .
aber ich übergebe schon dem Widget das SubWindow, das brauche ich für eine andere Methode.
hier mal mein konstruktor:

Code: Alles auswählen

MySubWindow *sw = new MySubWindow();
     sw->setWidget(new table(sw));
damit das SubWindow jetzt weiß welchem table es jetzt den Wert geben soll müsste ich z.B. einen solchen Konstruktor verwenden:

Code: Alles auswählen

table *t = new table(sw);
MySubWindow *sw = new MySubWindow(t);
aber das das nicht klappt sollte klar sein . . . meine frage ist jetzt wie kann ich table, MySubWindow übergeben und MySubWindow, table??

MfG Jan
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

Wie wäre es, wenn du das Ganze per Signal machst? Bei Größenänderung ein Signal mit den benötigten Parametern per "emit" raus schicken an einen Slot im Widget, das den Wert empfangen und verarbeiten soll.

Wenn ich dich richtig verstanden habe, sollte das doch so gehen.
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

wie kann ich denn ein eigenes SIGNAL erstellen?? o0
weil wenn ich als SIGNAL resizeEvent auswählen will geht das nicht . . .
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

In deiner Header-Datei (der sendenden Klasse) trägst du z.B. Folgendes ein:

signals:
void resizeTable(Table *, int);

Dann kannst du innerhalb dieser Klasse per

emit resizeTable(p_t, value);

das Signal an den zuvor per connect(...) verbundenen Slot schicken. Siehe dazu auch Qt-Docs unter "Signals & Slots". Das Signal kann natürlich anders heißen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

Qt Doku -> Signals & Slots
Gehört zu den ersten Sachen, die man sich bei Qt durchlesen sollte. Bitte nachholen.
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

Code: Alles auswählen

connect(sw,SIGNAL(resizeTable(t,int)),t,SLOT(getZ(int)));
das müsste ja dann der connect befehl sein . . .
aber ich bekomme das in der klasse mysubwindow.cpp nicht hin :(
in meiner mysubwindow.h:

Code: Alles auswählen

signals:
    void resizeTable(table*,int);
in meiner mysubwindow.cpp:

Code: Alles auswählen

void MySubWindow::resizeTable(table t,int i){}
aber ich weiß jetzt nicht wo das

Code: Alles auswählen

emit resizeTable(p_t, value);
hin muss . . .
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

signals brauchen keine Implementierung -> Doku!
emit da wo etwas passiert, was du wissen willst -> resizeEvent.
Warum willst du eigentlich das resize des parents an das child übergeben, wo das child schon eine eigene Klasse ist?
Wenn du Layouts verwendest, wird das child bei Größenänderung des parents mit vergrößert, du könntest dann dort (im child) direkt auf die Größenänderung reagieren.
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

Du musst für das Signal keinen Funktionrumpf schreiben - also ist das in deiner mysubwindow.cpp überflüssig.
Wichtig ist natürlich auch, dass Signal und Slot übereinstimmen, was die Parameter angeht.

Code: Alles auswählen

connect(*sender, SIGNAL(resizeTable(Table *, int)), *receiver, SLOT(getZ(Table *, int)));
Wenn der Sender das QObject ist, in dem du den connect(...) ausführst, dann kannst du als *sender auch this schreiben.

Das emit packst du dahin, wo du die Größenänderung mitbekommst, also vermutlich innerhalb des ResizeEvents.

Die Funktion getZ(Table *, int) muss dann in der Empfängerklasse bzw. in deren Header-Datei natürlich entsprechend unter slots: deklariert worden sein:

Code: Alles auswählen

slots:
    void getZ(Table *, int);
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

der meckert jetzt noch hier:

Code: Alles auswählen

signals:
    void resizeTable(table*, int);
'table' has not been declared
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

"table" ist natürlich der Name deiner Klasse, auf die du einen Zeiger übergeben willst. Wie die jetzt real heißt, kann ich dir nicht sagen.

Sollte sie tatsächlich "table" heißen, dann eben noch per "class table;" in deiner Header-Datei vor deiner class MySubWindow... hinschreiben.

Code: Alles auswählen

class table;

class MySubWindow : public QMdiSubWindow
.
.
.
Da, wo du direkt auf Member von "table" zugreifen möchtest, musst du natürlich deine "table.h" inkludieren.
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

okay . . .jetzt hat der ein problem mit dem

Code: Alles auswählen

emit resizeTable(t,y);
't' was not declared in this scope
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

Langsam wirds albern, und hat auch kaum noch was mit Qt zu tun.
Wie bei allen Sachen muss das Objekt (der Name) im Kontext bekannt sein. Wenn du es an anderer Stelle erstellst, musst du dafür sorgen, dass es in anderen Teilen (Methoden) deiner Klasse verfügbar ist -> als Member abspeichern.
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

Da muss ich mich anschließen - das geht doch sehr Richtung Grundlagen. :wink:
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

ja tut mir leid aber die ganze SINGAL und SLOT geschichte finde ich sehr verwirrend . . .
ich hab mir die Doku jetzt das 2te mal durchgelesen aber ich steige mit der "emit" sache immer noch nicht dahinter . . :cry:
und jetzt hat das emit wieder ein problem :cry:
undefined reference to 'MySubWindow::resizeTable(table *, int)
dabei steht in der mysubwindow.h

Code: Alles auswählen

signals:
void resizeTable(table*, int);
public:
table *t;
und in der .cpp

Code: Alles auswählen

emit resizeTable(t,y);
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

Poste mal deine ganze Header-Datei.
Antworten