Seite 1 von 1

[gelöst][QT4.1] Problem mit QRadioButton

Verfasst: 25. Januar 2006 23:07
von methusalem
Moin,

ich möchte abhängig von einem übergebenen Wert 32 Radiobuttons "schalten". Hier mal der Quelltext dazu:

Code: Alles auswählen

bool Modultest::changeGUI(unsigned long value){
	
	change = status ^ value;

	for(int i=0; i<32; i++){

		if(change & (1<<i)){

			fprintf(stderr,"%x %d - ",change, i);
			radioButton[i]->setCheckable(true);

			if(value & (1<<i)){
				fprintf(stderr,"true\n");
				radioButton[i]->setChecked(true);
			}else{
				fprintf(stderr,"false\n");
				radioButton[i]->setChecked(false);
			}

			radioButton[i]->setCheckable(false);
		}
	}
	status = value;
	return true;
}
In status steht der aktuelle Status der Radiobuttons. In value der neue Wert. Per exclusivem ODER werden diese beiden Variablen verknüpft und der Variablen change zugewiesen. In einer Schleife wird nur dann eine Aktion gemacht, wenn sich in value ein Bit geändert hat (dann ist an dieser Position in change das Bit auf 1).
Das funktioniert mit der Bitoperation auch wunderbar. ABER:
Ich kann auf diesem Wege die Radiobuttons "einschalten", aber nicht wieder ausschalten. radioButton->setChecked(false) bleibt ohne Wirkung. Wenn ich allerdings mit der Maus über die RadioButtons drüberherfahre (ohne Klicken), dann ändern Sie sich.

Eigentlich missbrauche ich hier die Radiobuttons zur Statusanzeige. Mir ist aber kein anderes Object in die Finger gefallen. Hat jemand ne Idee, wie ich das Problem lösen kann?

Ich möchte in einem Dialog den Status von 32 IO Pins einer USB Karte anzeigen.

Re: [QT4.1] Problem mit QRadioButton

Verfasst: 26. Januar 2006 18:50
von Kris
methusalem hat geschrieben:Moin,

ich möchte abhängig von einem übergebenen Wert 32 Radiobuttons "schalten". Hier mal der Quelltext dazu:

Code: Alles auswählen

bool Modultest::changeGUI(unsigned long value){
	
	change = status ^ value;

	for(int i=0; i<32; i++){

		if(change & (1<<i)){

			fprintf(stderr,"%x %d - ",change, i);
			radioButton[i]->setCheckable(true);

			if(value & (1<<i)){
				fprintf(stderr,"true\n");
				radioButton[i]->setChecked(true);
			}else{
				fprintf(stderr,"false\n");
				radioButton[i]->setChecked(false);
			}

			radioButton[i]->setCheckable(false);
		}
	}
	status = value;
	return true;
}
In status steht ... ABER:
Ich kann auf diesem Wege die Radiobuttons "einschalten", aber nicht wieder ausschalten. radioButton->setChecked(false) bleibt ohne Wirkung. Wenn ich allerdings mit der Maus über die RadioButtons drüberherfahre (ohne Klicken), dann ändern Sie sich.



Moin,
meine Meinung dazu (ist aber bloß ne Meinung, nicht überprüft und
möglicherweise flasch).

1. Hilft möglicherweise nach der Änderung ein this->repaint(), also

Code: Alles auswählen

for ( ... ) { ...
   if ... {
      ...
      radioButton[i]->setChecked( (change & (1<<i)) ? true:false);
   }
}
status = value;
this->repaint();
return true;
2. Frage :
Gilt die Information "only checkable buttons can be checked" aus der Doku
nur für manuelles "checken" ?
Du setzt jeden Button auf "uncheckable" am Ende.


Gruß,
Kris

Verfasst: 26. Januar 2006 22:17
von methusalem
Danke für die Hilfe. Ich habs nun anders gemacht. Ich habe die RadioButtons gegen QLabel mit einer QPixmap ausgetauscht. Das funktioniert prächtig!

Code: Alles auswählen

lblPort27->setPixmap(QPixmap(QString::fromUtf8(":/button/images/gruen.xpm")));

Verfasst: 27. Januar 2006 10:49
von macman
methusalem hat geschrieben:Ich habe die RadioButtons gegen QLabel mit einer QPixmap ausgetauscht. Das funktioniert prächtig!
Das ist auf jeden Fall die bessere Lösung, zumal man gerade in solchen Fällen 3 Werte zur Verfügung haben sollte, An, Aus, nicht auslesbar.