Forum: PC-Programmierung QCheckbox mit eigenem Image


von Nico (Gast)


Lesenswert?

Hallo,

ich habe mir mit dem QtDesigner eine kleine GUI gebastelt. Bestandteil 
sind ein paar QPushButtons und einige QCheckBoxen. Im nächsten Schritt 
habe ich das Stylesheet für die Buttons geändert, durch das Hinzufügen 
eines border images habe ich eine eigene Grafik für den Button 
eingefügt. Klappt soweit auch alles.
Das habe ich dann auch für die CheckBoxen gemacht, dort habe ich 
allerdings das Problem, dass meine Grafik im Hintergrund liegt und die 
originale CheckBox von Qt darüber. Hier mal das Stylesheet dazu:
1
#cBox_LoadData{
2
background-color:transparent;
3
border-image: url(./checkbox_off.png);
4
background:none;
5
border:none;
6
background-repeat:none;
7
}
8
#cBox_LoadData:checked{
9
border-image: url(./checkbox_on.png);
10
}

Kennt einer das Problem?
Danke im Voraus!
Gruß Nico

von Mr. Mephistopheles (Gast)


Lesenswert?

Hm...
Da noch keiner was geschrieben hat, gebe ich mal doch eine halbgare Idee 
von mir.
>Vorraus noch zwei Fragen:
1.) Kannst du mal ein Bild posten wie es aktuell aussieht und dann 
beschreiben, was du eigentlich willst?

2.) Ich NEHME an, du willst ein Bild wo bei Status "Checked" der Haken 
vor dem Bild zu sehen ist, aber sonst die übliche Chekbox-Erscheinung 
verborgen bleibt?

>> Zu meiner Idee:
Letztlich könntest du dir eine eigene Klasse bauen, die auf einem 
QPushButton basiert und das Interface vom QCheckBox erbt.
Innerhalb der Klasse verschaltest du das clicked() Signal mit einem 
internen Slot einer Statusvariable welche du im Slot toggelst und die 
dann dem Status der "PseudoCheckBox" entspricht. Je nachdem in welchen 
Status getoggelt wird, weißt du ein anderes Stylesheet zu.

>>DENNOCH
solltest du vorher relativ sicher sein, dass das was du vorhast nicht 
auch mit einer CheckBox geht, denn mein Vorschlag geht stark in die 
Richtung "Reinvent the wheel".

von Nico (Gast)


Lesenswert?

Hallo,

ich will einfach das Qt Image der Checkbox durch ein eigenes ersetzen.
So halb funktioniert es ja auch. Das Problem ist, dass mein eigenes 
Image unter der Qt Checkbox liegt. Ich stelle später mal ein Bild ein.

von Mr. Mephistopheles (Gast)


Lesenswert?

Must mal abwarten, ob jemand mit einer besseren Idee als meiner kommt. 
Sonst gibt es doch auch ein dezidiertes Qt-Forum.
Warscheinlich wäre es bei meiner Idee eh viel schlauer, zu schauen, ob 
man einer eigenen Klasse einfach die QCheckBox Klasse vererbt. Kenne die 
Qt Klassenhierachie nicht im Detail - könnte mir vorstellen, dass 
QPushbutton und QCheckBox sich Basisklassen teilen. So kann es durchaus 
sein, dass QCheckBox auch ein clicked() Signal hat, was du in deiner 
eigenen Klasse abfangen könntest...

von Noch einer (Gast)


Lesenswert?

Mit einem QBushButton eine Checkbox basteln ist nicht weiter schwierig. 
So was in der Art:
1
Im Stylesheet
2
QPushButton {border-image: ...}
3
QPushButton:hover {border-image: ...}
4
QPushButton[attention="checked"] {border-image: ...}
5
QPushButton:hover[attention="checked"] {border-image: ...}
6
7
Im Programm
8
void Mask::breakButtonClicked()
9
{
10
  ui->checkBreak->setProperty("attention", "checked");
11
}

Oder halt eleganter mit einer eigenen Klasse von QPushButton abgeleitet.

von Noch einer (Gast)


Lesenswert?

Mir fällt gerade noch auf - das funktionierte bei mir nur mit einem 
Workaround. Nach dem setProperty() braucht es noch ein setStyleSheet()
1
ui->checkBreak->setProperty("attention", "checked");
2
ui->checkBreak->setStyleSheet(ui->checkBreak->styleSheet());

von Rolf M. (rmagnus)


Lesenswert?

Du weißt aber, dass man einen Button auch einfach checkable machen kann? 
Da braucht man keine eigene Property dafür zu definieren. Es reicht ein 
button->setCheckable(true). Im Stylesheet kann man dann direkt die 
Property "checked" benutzen.

Noch einer schrieb:
> Nach dem setProperty() braucht es noch ein setStyleSheet()

Man muss nicht gleich das ganze Stylesheet neu damit verbinden. Es 
reicht ein:
1
style()->unpolish(button);
2
style()->polish(button);

: Bearbeitet durch User
von Nico (Gast)


Lesenswert?

Rolf M. schrieb:
> Du weißt aber, dass man einen Button auch einfach checkable machen kann?

Vielen Dank für den Hinweis, das habe ich die ganze Zeit übersehen. Mit 
diesem "Trick" funktioniert es nun.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.