func-call anderer Klassen aus Event?
-
Hey, hab vor ein paar Wochen mit Qt 4 unter VS 2008 angefangen zu arbeiten und komme jetzt nicht mehr weiter.
Ich habe zwei Klassen, eine MainWindow und eine RenderArea, in der verschiedene Zeichenoperationen ausgeführt werden.
Ich möchte jetzt aus der mousePressEvent der RenderArea eine Funktion aus MainWindow aufrufen, bekomme aber egal wie ich es versuche immer Fehler.
Die Funktion sieht so aus, und ich möchte "changelabel1()" meines mainWindow Objektes aufrufen:
void RenderArea::mousePressEvent(QMouseEvent *event) { if (type>2){ if (type==13) type = 3; else type+=1; update(); } //MainWindow::changelabel1(); ?? //mainWindow.changelabel1(); ?? }
Die Funktion changelabel1() ist in der MainWindow Klasse ganz normal als public deklariert.
Wie kann ich diese nun aus der Klasse RenderArea heraus aufrufen ohne einen Fehler zu bekommen?
Ich hoffe, die Infos sind ausreichend.Grüße, Sean
-
class YourMainWindow : public QMainWindow { Q_OBJECT ... public slots: void changeLabel(); }; class RenderArea : public QObject // oder was auch immer du brauchst { Q_OBJECT ... signals: void changeLabel(); }; YourMainWindow::YourMainwindow() { RenderArea* area = new RenderArea( this ); connect( area, SIGNAL( changeLabel() ), this, SLOT( changeLabel() ) ); } void RenderArea::mousePressEvent( QMouseEvent* event ) { ... emit changeLabel(); }
so in etwa...
-
Cool, vielen dank erstmal, hat funktioniert.
Aber ich versteh noch nicht so recht wieso... ich hab das Prinzip von den Signals und Slots so mehr oder weniger verstanden, dachte ich, aber wieso sind signal und slot hier gleich? Ein paar erklärende Worte noch?
Jetzt ergibt sich mir aber noch ein Problem, merk ich grad.
Ich habe 5 RenderArea Objekte, welche changelabel1() bis changelabel5() aufrufen sollen; soll heißen RenderArea Objekt1 soll changelabel1, Objekt2 changelabel2() usw. aufrufen. Gibt es da eine einfache Lösung, dass im mousePressEvent entschieden wird, welches changelabel_() aufzurufen ist?
Mir fällt spontan nur ein, der Klasse einen weiteres Attribut zu geben, static int zB, und dann diesen jedes Mal im mousePressEvent abzufragen. Geht das irgendwie geschickter?Vielen Dank,
Sean
-
aber wieso sind signal und slot hier gleich?
Das ist voellig willkuerlich. Identische Namen sind natuerlich legitim da sie zu unterschiedlichen Klassen gehoeren. Du kannst sie aber auch KapitaenLangstrumpf() und HansWurst() nennen.
dass im mousePressEvent entschieden wird, welches changelabel_() aufzurufen ist?
Loese immer das gleiche Signal aus und pruefe im Slot (Empfaenger) mit der Funktion sender, welches Objekt das Signal ausgeloest hat.
-
ach soo..ja gut, klar... das hatte mich jetzt verwirrt, danke. Werde das mit der Sender Funktion mal ausprobieren!