Ändern Zustand einer checkbox nicht aktiviert ist, wenn andere checkbox aktiviert ist pyqt
Ich bin mit der Designer von Qt und pyqt code zum schreiben einer app.
Ich habe eine ganz einfache Frage: in meinem UI ich habe 2 Checkboxen und was ich brauche, ist, um das erste Kontrollkästchen, wie immer deaktiviert wenn die zweite checkbox ist deaktiviert.
In anderen Worten, die erste checkbox kann nur überprüft werden, wenn die zweite checkbox angekreuzt ist, aber die zweite checkbox kann überprüft werden, auch wenn ersteres nicht überprüft.
In Qt Designer habe ich nicht finden, eine einfach Art und Weise zu tun, die mit den Signalen/Slots-Funktion.
Hatte ich einen Blick in die Qt-API und ich habe versucht, code zu schreiben:
class CreateRIVLayerDialog(QDialog, FORM_CLASS):
def __init__(self, iface)
# some more code here...
if self.addCheckDB.isChecked():
self.addCheck.setChecked(False)
aber ohne Ergebnisse.
Hat jemand einige Tipps?
Dank
InformationsquelleAutor matteo | 2016-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Am einfachsten ist es, mit zwei signal-verbindungen, von denen kann getan werden im Qt Designer.
Ihr design erfordert, dass "die erste checkbox kann nur überprüft werden, wenn die zweite checkbox aktiviert". Dies ist äquivalent zu sagen, das erste checkbox sollte deaktiviert wenn die zweite checkbox ist deaktiviert. Deaktivieren Sie das Kontrollkästchen ermöglicht es dem Benutzer klar, dass die option nicht verfügbar ist.
Also im Qt-Designer, schließen Sie die
toggled
signalcheckbox2
zu densetEnabled
slotcheckbox1
. (Es kann auch erforderlich sein, um die anfänglicheenabled
Zustandcheckbox1
im Qt Designer).Dann in Ihrem code vornehmen, sollten Sie eine zweite Verbindung, wie diese:
Diesem wird klar, dass der Aktivierungszustand von
checkbox1
wenncheckbox2
deaktiviert ist.Wenn Sie das tun wollten, die ganze Sache im code würde es so Aussehen:
So es kann getan werden, mit lambdas. Cool. +1 von mir.
Es scheint nicht bei alle Fremd für mich. Du bist zu Fragen für den Zustand des widgets abhängig von einem anderen in einer ganz bestimmten Art und Weise. Ich denke, die beiden Antworten, die Sie bekamen, zeigen, dass die pyqt und macht zu tun, dass in etwa so einfach, wie es vernünftigerweise sein könnte.
InformationsquelleAutor ekhumoro
Nur die Signale. Sind Sie richtig, wenn Sie sagen, dass Sie nicht direkt zu tun, über die designer, da Sie zu invertieren Sie die checked-Eigenschaft. Die einfachste und am besten lesbare Weise, die mir in den Sinn kommt, ist mit einem common-slot plus einen internen member-variable speichert den Aktivierungszustand für beide:
Hinzufügen
self._toggle = INITIAL_VALUE
zu Ihrer Klasse - die INITIAL_VALUE enthält einen booleschen Wert, die Sie verwenden, um aktivieren/deaktivieren Sie Ihre KontrollkästchenSlots Hinzugefügt:
Verbinden Sie die
clicked
signal der beiden Checkboxen an diesem slot.Warnung! Tun nicht verwenden Sie die
stateChanged
signal hier oder starten Sie eine Endlosschleife. :3Was ich hier mache ist im Grunde die übernahme der änderung des Status der beiden Checkboxen und es manuell tun, indem Sie den Wert
self._toggle
für die erste checkbox und dem invertierten Wert vonself._toggle
für die zweite checkbox.Wenn Sie wollen, weniger invertieren in den Schlitz der folgende funktioniert auch, aber es ist weniger gut lesbar omho:
Hinweis: Sie können auch
isChecked()
in den Schlitz und alles von oben ohne die zusätzliche variable allerdings finde ich diese besser lesbar und mit viel weniger Funktionsaufrufe (alleisChecked()
undsetChecked()
ist ein Funktionsaufruf)Wenn mit "viele" meinst du 3-4 Zeilen...Sicher. LOL kann Man nicht weglassen, der Mann in der Mitte (der Schlitz) hier, da Sie einige benutzerdefinierte Verhalten. Wenn es "ich will (nicht)überprüfen Sie die beiden Checkboxen in der gleichen Zeit, wenn ich (un)überprüfen Sie auf einer von Ihnen," Sie hätte die einfachere Lösung direkt angeschlossen, Ihre slots und Signale. Meines Wissens Invertierung eines Signals mit dem Wert ohne zusätzlichen Platz (slot), wo Sie damit umgehen, das ist nicht möglich. Vielleicht mit einer lambda-Funktion...
yep, wenn die check-uncheck-Staaten synchronisiert werden sollen, ich denke, Sie können einfach mit dem Qt Designer.. ich werde versuchen, Ihren code nochmals vielen Dank!
Np, wenn du noch mehr Fragen/Anregungen/etc. fühlen Sie sich frei, um einen Kommentar hier. 🙂
InformationsquelleAutor rbaleksandar
Ich weiß, ich bin spät zu dieser party, aber es ist ein Weg, um dies zu erreichen einfacher und ich denke, wie die original person wollte. Hier gehen Sie. Wenn Sie eine checkbox_1 und Sie aktivieren/deaktivieren Sie es, verbindet es mit der folgenden Funktion.
Wenn Sie möchten, checkbox_1, um zu überprüfen oder deaktivieren Sie viele Checkboxen (wie ein alles auswählen), dann statt der checkbox_1 direkt den Aufruf der oben genannten Funktion, Sie haben eine andere Funktion, die ruft andere Funktionen zu aktivieren/deaktivieren Sie die Felder, wie folgt:
Mir, folgt dies der logischste Weg, ohne zu technisch zu werden. Es funktioniert gut und ist schnell. Vielleicht nicht die effizienteste oder schönste, aber ich fand, dass dies der beste Weg, um aktivieren/deaktivieren Sie viele Checkboxen auf einmal.
InformationsquelleAutor Richard