Seite 1 von 1

QCheckBox: Immer nur eins sollte checked sein

Verfasst: 28. Mai 2008 19:02
von Condemned
hi leutz, also wie der titel schon sagt möchte ich das von drei checkboxen immer nur eine anklickbar ist.

Code: Alles auswählen

 void MathoMadaja::CheckBoxen()
 {
	if ( taeglich->setCheckState( Qt::Checked ) )
	{
			woechentlich->setCheckState( Qt::Unchecked );
			monatlich->setCheckState( Qt::Unchecked ); 	
	}

	if ( woechentlich->setCheckState( Qt::Checked ) )
	{
			taeglich->setCheckState( Qt::Unchecked ); 
			monatlich->setCheckState( Qt::Unchecked ); 
	}

	if ( monatlich->setCheckState( Qt::Checked ) )
	{
			taeglich->setCheckState( Qt::Unchecked );
			woechentlich->setCheckState( Qt::Unchecked ); 
	}

 }
jetzt bekomme ich aber die meldung vom compiler das er das nicht in bool konvertieren kann.

error: could not convert `(((Ui_MathoMadaja*)this) + 20u)->Ui_MathoMadaja::taeglich->QCheckBox::setCheckState( Checked)' to `bool'

meine frage ist nun, was mache ich falsch? und kann ich das anders machen oder muss ich das zuerst in bool konvertieren.

benutzte:
Qt 4:3
und habe Windows XP SP3

danke schon mal im vorraus :D

Verfasst: 28. Mai 2008 19:34
von PeterLustig
Kannst du überhaupt C++?

if ( woechentlich->setCheckState( Qt::Checked ) )

Was soll der Kram?

Verfasst: 28. Mai 2008 20:22
von upsala
Das sind nicht unbedingt fehlende C++-Kenntnisse, aber ein Blick in Doku würde das Problem auf jeden Fall sehr schnell lösen.

Mal davon abgesehen, daß wenn von 3 Zuständen nur einer angezeigt werden soll, man keine QCheckBox verwendet sondern einen QRadioButton. Außerdem nimmt die Doku von QButtonGroup noch eine Menge Arbeit ab.

Verfasst: 28. Mai 2008 21:04
von PeterLustig
upsala hat geschrieben:Das sind nicht unbedingt fehlende C++-Kenntnisse
Wenn er "nichts" als Argument in einer Kontrollstruktur angibt, dann zeigt das schon sehr deutlich die Unwissenheit des Programmierers.

Verfasst: 28. Mai 2008 21:41
von Condemned
ok ich kann nicht wirklich c++,noch nicht, aber könntet ihr mir vllt meine frage beantworten? die doku hilft mir ehrlich gesagt nicht unbedingt weiter, radio buttons will ich deswegen nicht weil immer ein radio button markiert bleibt.

hab hier eigentlich auf hilfe gehofft ...

Verfasst: 28. Mai 2008 22:09
von upsala
Sets the check box's check state to state.
Ok, Doku nicht gelesen, gelle? Oder wo steht da was von get?

Verfasst: 28. Mai 2008 22:10
von PeterLustig
Die Funktion setCheckState gibt dir void wieder, also nichts. Das kannst du nicht als einen Ausdruck in einer Kontrollstruktur nutzen...
Du solltest zuerst die Sprache lernen in der du programmieren willst, bevor du ein Framework wie Qt benutzt.

Re: QCheckBox: Immer nur eins sollte checked sein

Verfasst: 29. Mai 2008 07:28
von macman
Condemned hat geschrieben:hi leutz, also wie der titel schon sagt möchte ich das von drei checkboxen immer nur eine anklickbar ist.
Dann setz die anderen auf disabled, alles andere wäre nicht GUI-konform. Wenn Du es trotzdem so machen willst, dann reagier auf das itemClicked Signal, prüfe das item und setze es auf checked, wenn Bedingung erfüllt ist.

Re: QCheckBox: Immer nur eins sollte checked sein

Verfasst: 29. Mai 2008 09:48
von Christian81
macman hat geschrieben: Dann setz die anderen auf disabled, alles andere wäre nicht GUI-konform.
Und selbst das ist 'überraschend' bzw. funktioniert auch nicht wirklich - sobald eins angeklickt ist ist der Rest deaktivert und nichts geht mehr :)

Ich glaube drei Radiobuttons wären hier die Widgets der Wahl.

Verfasst: 29. Mai 2008 10:18
von dontinelli
Ich glaube nicht, dass er will, dass nur eine anklickbar ist, sondern ausgewählt.

@Condemned: Lies doch einmal die Doku richtig durch! Wenn dir das nicht klar genug ist, kann ich auch nicht weiterhelfen...
Und übrigens: Auch bei QRadioButtons kannst du mit setChecked(bool) den Status setzen, ist ja beides von QAbstractButton abgeleitet.

Wenn du Neuling bist: Lerne zuerst C++ und arbeite danach das Qt-Tutorial durch, alles andere ist sinnlos.

Re: QCheckBox: Immer nur eins sollte checked sein

Verfasst: 29. Mai 2008 10:49
von macman
Christian81 hat geschrieben:Ich glaube drei Radiobuttons wären hier die Widgets der Wahl.
Auf jeden Fall.
Wenn man mehrere Elemente hat, von denen nur eins anwählbar sein soll, dann muss man Radiobuttons nehmen.
Wenn eine Checkbox nicht anklickbar sein soll, dann muss man sie disabled setzen oder man spielt dem User was vor.
Ich habe eine Checkbox, die 4 Zustände annehmen kann, bei der man aber immer nur zwischen 2 Zuständen wechseln kann. Das ist dann keine Checkbox, sondern ein normales Item mit entsprechenden Icons drin :-)

Verfasst: 29. Mai 2008 16:54
von Condemned
Was soll der Kram?
tjo...
Die Funktion setCheckState gibt dir void wieder, also nichts
und siehe da es funktioniert mit void!

Code: Alles auswählen

void MathoMadaja::CheckBoxen_taeglich( )
 {
	 if ( taeglich->checkState( ) == Qt::Checked )
	{
		woechentlich->setCheckState( Qt::Unchecked );
		monatlich->setCheckState( Qt::Unchecked );	
	} 
	else
	{
		taeglich->setCheckState( Qt::Unchecked );
		woechentlich->setCheckState( Qt::Unchecked );
		monatlich->setCheckState( Qt::Unchecked );
	}

 }

void MathoMadaja::CheckBoxen_woechentlich()
{
	if ( woechentlich->checkState( ) == Qt::Checked )
	{
		taeglich->setCheckState( Qt::Unchecked );
		monatlich->setCheckState( Qt::Unchecked );
	}
	else
	{
		taeglich->setCheckState( Qt::Unchecked );
		woechentlich->setCheckState( Qt::Unchecked );
		monatlich->setCheckState( Qt::Unchecked );
	}

}

void MathoMadaja::CheckBoxen_monatlich()
{
	if ( monatlich->checkState( ) == Qt::Checked )
	{
		taeglich->setCheckState( Qt::Unchecked );
		woechentlich->setCheckState( Qt::Unchecked );
	}
	else
	{
		taeglich->setCheckState( Qt::Unchecked );
		woechentlich->setCheckState( Qt::Unchecked );
		monatlich->setCheckState( Qt::Unchecked );
	}
}
[sarkasmus]
danke für eure hilfe :)
[/sarkasmus][/quote]

Verfasst: 29. Mai 2008 17:02
von PeterLustig
Jetzt benutzt checkState, was nicht void wieder gibt. Vorher hast du setCheckState in der Kontrollstruktur benutzt, was allerdings void wieder gibt.

Verfasst: 29. Mai 2008 17:14
von Sephral
und siehe da es funktioniert mit void!
Ich befürchte Du hast nicht verstanden worum es hier ging :-)

Du hast in Deinem ersten Codebeispiel das hier verwendet...

Code: Alles auswählen

if ( taeglich->setCheckState( Qt::Checked ) ) 
Üblicherweise setzen Programmiersprachen nach einem if eine "condition" voraus. Das bedeutet nach dem Auflösen des Ausdrucks muss am Ende ein boolscher Wert herauskommen.

Da "setCheckState" aber keinen Rückgabewert (void) hat, konnte Dein Code nicht funktionieren, weshalb Du von PeterLustig darauf hingewiesen wurdest.

In Deinem letzten Code hast Du es richtig gemacht...

Code: Alles auswählen

 if ( taeglich->checkState( ) == Qt::Checked )  
Du benutzt zwar trotzdem noch setCheckState, aber diesmal an der richtigen Stelle :-)

Es wäre sicher auf hilfreich gewesen den hier mehrfach vorgetragenen Rat doch einfach RadioButtons zu verwenden zu berücksichtigen, denn die machen das alles automatisch (wenn man sie z.B. in eine GroupBox einsperrt) :-)

*winke winke*
Sephral


EDIT: PeterLustig war schneller :-)
EDIT2: Viel schneller wie ich gerade sehe...hab' aber ne Ausrede, war am telefonieren :-)

Verfasst: 29. Mai 2008 21:08
von Condemned
jo ich weiß eigentlich schon das radiobuttons besser sind, aber ich mach des im rahmen des info 2 projekts bei uns an der hochschule und da halt unser chefentwickler eben checkboxen gewollt ^^... aber finde ich gut das ihr das positiv aufgenommen habt *daumen hoch* :D