Seite 1 von 2

MySubWindow

Verfasst: 10. August 2011 09:54
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

Re: MySubWindow

Verfasst: 10. August 2011 10:07
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.

Re: MySubWindow

Verfasst: 10. August 2011 10:15
von janmerkschien
wie kann ich denn ein eigenes SIGNAL erstellen?? o0
weil wenn ich als SIGNAL resizeEvent auswählen will geht das nicht . . .

Re: MySubWindow

Verfasst: 10. August 2011 10:27
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.

Re: MySubWindow

Verfasst: 10. August 2011 10:34
von franzf
Qt Doku -> Signals & Slots
Gehört zu den ersten Sachen, die man sich bei Qt durchlesen sollte. Bitte nachholen.

Re: MySubWindow

Verfasst: 10. August 2011 10:48
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 . . .

Re: MySubWindow

Verfasst: 10. August 2011 10:56
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.

Re: MySubWindow

Verfasst: 10. August 2011 11:02
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);

Re: MySubWindow

Verfasst: 10. August 2011 11:18
von janmerkschien
der meckert jetzt noch hier:

Code: Alles auswählen

signals:
    void resizeTable(table*, int);
'table' has not been declared

Re: MySubWindow

Verfasst: 10. August 2011 11:38
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.

Re: MySubWindow

Verfasst: 10. August 2011 11:48
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

Re: MySubWindow

Verfasst: 10. August 2011 11:56
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.

Re: MySubWindow

Verfasst: 10. August 2011 12:07
von Mordy
Da muss ich mich anschließen - das geht doch sehr Richtung Grundlagen. :wink:

Re: MySubWindow

Verfasst: 10. August 2011 12:17
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);

Re: MySubWindow

Verfasst: 10. August 2011 12:37
von Mordy
Poste mal deine ganze Header-Datei.