QtCheckBox als Bedingung

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Dionysos
User
Beiträge: 7
Registriert: Montag 17. Juni 2019, 09:01

Hallo,

ich brauche eure Hilfe, da ich die Funktion der QtCheckBox vermutlich nicht richtig verstanden habe.

Ich habe mit dem Qt Designer 3 Fenster erstellt. Ein MainWindow und 2 Widgets.
In dem MainWindow("hauptfenster.ui") befinden sich ein PushButton("FZButton") und eine Checkbox("checkBoxFZ")(Natürlich noch mehr Elemente, die hierfür jedoch keine Rolle spielen).
Das Programm soll nun bei Klicken des PushButton und bei aktivierter CheckBox Fenster 2("fz.ui") und bei nicht aktivierter CheckBox Fenster 3 ("error.ui") öffnen.
Versucht dies umzusetzen habe ich mit stateChanged.
Geschrieben und ausgeführt wird das ganze in Spyder.

Das Problem ist, dass sobald der Haken gesetzt und der PushButton betätigt wird wie gewollt nur das Fenster 2 sich öffnet, nehme ich jedoch den Haken wieder heraus und betätige den Button öffnen sich beide Fenster. Wieso?

Code: Alles auswählen

from PyQt5 import QtWidgets, uic
import sys

app = QtWidgets.QApplication([])

 #Importieren der Guis
win=uic.loadUi("hauptfenster.ui")
fz = uic.loadUi("fz.ui")
error=uic.loadUi("error.ui")

class Hauptfenster():
        
    def verbinden(state):
        def openFZ(self):
            fz.show()
        def openError(self):
            error.show()
        
        if state==2:
            win.FZButton.clicked.connect(openFZ)
        elif state==0:
            win.FZButton.clicked.connect(openError)
    
    win.checkBoxFZ.stateChanged.connect(verbinden)

win.show()
sys.exit(app.exec_())

Danke schon mal für eure Hilfe.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann das so machen. Tut man aber nicht. Wenn man das zum funktionieren bringen wollte, wuerde man erstmal die bestehende Verbindung loeschen muessen, bevor man eine neue anlegt. Da du das nicht tust, sammelst du nur munter open* calls auf, die dann mehr und mehr und mehr werden.

Was man stattdessen tut: EINEN Slot an FZButton.clicked binden, dass dann beim klicken schaut, ob die Checkbox gewaehlt wurde oder nicht, und davon dann abhaengig das eine oder das andere Unterfenster oeffnet.

Und dann gibt's noch nen Sack voll Dinge zu sagen zu deinem Code:

- auf Modulebene hat kein Code zu stehen, sonden nur importe, Konstanten, Klassen- und Funktionsdefinitionen.
- deine Klasse Hauptfenster ist faktisch keine Klasse, sondern einfach ein komischer Namensraum um zum einen Code der direkt laeuft (wie gesagt, schlecht), zum anderen eine Funktion, die nur auf den ersten Blick aussieht wie eine Methode - aber halt keine ist.
- du solltest QApplication nicht mit leeren Argumenten instantiieren, es gibt Nutzungsfaelle wo Qt die braucht.

Ungetestet:

Code: Alles auswählen

from PyQt5 import QtWidgets, uic
import sys

class Hauptfenster():
        
    def __init__(self):
        self._win=uic.loadUi("hauptfenster.ui")
        self._fz = uic.loadUi("fz.ui")
        self._error=uic.loadUi("error.ui")
        self._win.FZButton.clicked.connect(self._unterfenster_oeffnen)
        self._win.show()

    def _unterfenster_oeffnen(self):
        if self._win.checkBoxFZ.state():
             self._fz.show()
        else:
            self._error.show()

def main():
     app = QtWidgets.QApplication()
     hauptfenster = Hauptfenster()
     sys.exit(app.exec_())

if __name__ == "__main__":
    main()
Dionysos
User
Beiträge: 7
Registriert: Montag 17. Juni 2019, 09:01

Ich danke dir für deine Mühe.
Es funktioniert jetzt mit leichten Änderungen.

Code: Alles auswählen

from PyQt5 import QtWidgets, uic
import sys

class Hauptfenster():
        
    def __init__(self):
        self._win=uic.loadUi("hauptfenster.ui")
        self._fz = uic.loadUi("fz.ui")
        self._error=uic.loadUi("error.ui")
        self._win.FZButton.clicked.connect(self._unterfenster_oeffnen)
        self._win.show()

    def _unterfenster_oeffnen(self):
        if self._win.checkBoxFZ.checkState():
            self._fz.show()
        else:
            self._error.show()

def main():
     app = QtWidgets.QApplication([])
     hauptfenster = Hauptfenster()
     sys.exit(app.exec_())

if __name__ == "__main__":
    main()
Antworten