2011-01-05 4 views
1

Ich habe eine QStackedWidget, deren erste Seite auf Wgt1 gesetzt ist. Wgt1 enthält 3 Tasten btn1,btn2 undWie verbinde ich mein QToolButton mit setIndexPage auf meinem QStackedWidget in Qt?

Btn3

. Ich möchte folgendes tun

  1. Wenn Widget startet, sollte SetIndex als Null, das ist meine erste Seite auf QStackedWidget.
  2. Wenn ich btn1,btn2 und btn3 drücke, sollte ich zu indexPage 1, 2 und 3 jeweils verschieben.

Ich wollte Signal verwenden und Schlitz so versucht, das clicked() Signal von QToolButton zu s etCurrentIndex(int) Schlitz QStackedWidget zu verbinden. Aber es funktioniert nicht, da click() keinen (int) -Wert sendet, der von setCurrentIndex(int) benötigt wird. Deshalb dachte ich, die MousePressEvent(MouseEvent *e) zu überschreiben. Ich möchte etwas wie eine neue signal(int) in meinem Wgt1 vorstellen, so dass es einen bestimmten ganzzahligen Wert beim Drücken der Tasten auf der ersten Seite ausgeben wird.

Aber um dies zu implementieren Ich bin nicht klar über folgende

  1. Welche MousePressEvent() ich außer Kraft setzen sollte? Für meine Wgt1 (die die Tasten enthält) oder für die QToolButtons, die von meiner Wgt1 enthalten ist?
  2. Wenn ich für Wgt1 überschreiben möchte, wie kann ich in der QMousePressEventQToolButton gedrückt werden?
    1. Wenn ich für QToolButton überschreiben möchte, wie man es schreibt? Soll ich eine neue Klasse erstellen, die von QToolButton stammt? oder kann ich einen Funktionszeiger oder einen Ereignishandler zu MousePressEvent() zuweisen?

Wenn Sie die oben genannten Fragen beantworten kann es hilfreich sein, sonst können Sie jede andere Art und Weise legen auch nahe, dieses Problem zu lösen. Ich weiß nicht, ob ich mein Problem klar oder nicht erklärt habe. Bitte kehren Sie zurück Ich werde versuchen, es mehr zu erklären.

Antwort

5

Es gibt viele mögliche Lösungen, aber ich empfehle, QSignalMapper zu verwenden. Ich denke, dass das Überschreiben eines Event-Handlers komplexer als nötig ist.

Der Code würde in etwa so aussehen:

QSignalMapper* sm = new QSignalMapper(this); 

// connect to `clicked' on all buttons 
connect(btn1, SIGNAL(clicked()), sm, SLOT(map())); 
connect(btn2, SIGNAL(clicked()), sm, SLOT(map())); 
connect(btn3, SIGNAL(clicked()), sm, SLOT(map())); 

// setMapping on each button to the QStackedWidget index we'd like to switch to 
// note: this affects the value passed via QSignalMapper::mapped(int) signal 
sm->setMapping(btn1, 1); 
sm->setMapping(btn2, 2); 
sm->setMapping(btn3, 3); 

// finally, connect the mapper to the stacked widget 
connect(sm, SIGNAL(mapped(int)), stackedWidget, SLOT(setCurrentIndex(int))); 
Verwandte Themen