Seite 1 von 1

ButtonGroup reagiert nicht auf Klicken

Verfasst: 10. Januar 2010 00:31
von qtNiko
hi,
heute habe ich gleich mehrere Probleme :(

Jetzt geht es um eine QButtonGroup mit 3 RadioButtons.
Sie werden im Constructor zur Gruppe "displayb" zusammengefasst und jeder einzeln mit dem Slot "dispArt_changed()" verbunden.

Code: Alles auswählen

Constructor:
...
displayb = new QButtonGroup(this);
	displayb->addButton(radioB_dispgw, 1);
	displayb->addButton(radioB_dispgrad, 2);
	displayb->addButton(radioB_disprichtg, 3);

connect(radioB_dispgw, SIGNAL(toggled()), this, SLOT(dispArt_changed()));
	connect(radioB_dispgrad, SIGNAL(toggled()), this, SLOT(dispArt_changed()));
	connect(radioB_disprichtg, SIGNAL(toggled()), this, SLOT(dispArt_changed()));
...
Der Slot dispArt_changed() sieht so aus:

Code: Alles auswählen

void ImgView::dispArt_changed() {

	if (displayArt != (DISP_ART)displayb->checkedId()) {
		displayArt = (DISP_ART)displayb->checkedId();
		refresh_overlays();	// malt auch das jeweilige Bild
	}
}
Wenn ich die 3 Buttons drücke, wird bei keinem dispArt_changed() aufgerufen.

Was kann das sein?

Verfasst: 10. Januar 2010 09:15
von upsala
1. Das Signal ist falsch, es heist toggled(bool)
2. Warum verwendest du eine QButtonGroup und connectest dann doch jeden Button einzeln?

Verfasst: 10. Januar 2010 10:06
von qtNiko
Tja, jetzt habe ich die 3 Statements geändert:

Code: Alles auswählen

connect(radioB_dispgw, SIGNAL(toggled(bool)), this, SLOT(dispArt_changed())); 
connect(radioB_dispgrad, SIGNAL(toggled(bool)), this, SLOT(dispArt_changed()));
	connect(radioB_disprichtg, SIGNAL(toggled(bool)), this, SLOT(dispArt_changed()));
aber die Knöpfe senden immer noch kein SIGNAL, bzw. nicht das, worauf mein Programm wartet.

Zur zweiten Frage:
Ich würde mir auch ein SIGNAL wünschen, das von der ButtonGroup immer dann gesendet wird, wenn einer der Knöpfe gedrückt wurde. Dann müsste man nur ein Signal verbinden. Damit hab ich es zuerst probiert.

Code: Alles auswählen

Im constructor:
displayb = new QButtonGroup(this);
	displayb->addButton(radioB_dispgw, 1);
	displayb->addButton(radioB_dispgrad, 2);
	displayb->addButton(radioB_disprichtg, 3);

Im Headerfile:
private slots:
    void on_displayb_buttonClicked(int id);

Im cpp-File:
void ImgView::on_displayb_buttonClicked(int id) {
  if (id == 1) ...

}
Meine Erwartung war, dass das Signal buttonClicked(int id) immer dann gesendet wird, wenn einer der Knöpfe gedrückt wird, und die Nummer des Knopfes als id mitgegeben wird.
Es hat aber nicht funktioniert, d.h. keiner der Knöpfe hat den Aufruf von on_displayb_buttonClicked(int id) bewirkt.

Stehe ich denn voll auf der Leitung?

Verfasst: 10. Januar 2010 10:52
von upsala
Die Signale sind verbunden? Es erfolgt keine Fehlermeldung auf der Konsole? Was sagt der Debugger dazu?

Verfasst: 10. Januar 2010 21:38
von qtNiko
Nun, ich hatte einen Breakpoint auf die erste Zeile in "dispArt_changed()" gesetzt, der nie angesprungen wurde. Aber das meinst du wohl nicht?

Man kann doch nicht in den Qt-Bibliotheken debuggen, um zu sehen, was da drin passiert. Und wenn es möglich wäre, dann müsste ich mich in einem Riesenpaket an Code zurechtfinden, den ich noch nie gesehen habe.

Was ich nicht verstehe, ist, dass etwas, was ich schon zig-mal gemacht habe (Knöpfe mit Slots verbinden, etc.), jetzt plötzlich nicht geht. Gibt es irgendwelche Einstellungen an den Properties z.B., die verhindern, dass der Klick ein Signal veranlasst? (enabled sind die Knöpfe natürlich)