Es lässt sich nicht uuf eine Instanzvariable in einer QMessagebox zugreifen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

Ich habe folgende Klasse welche, ich wie folgt erzeuge - ScrollMessageBoxShowRC(None) (siehe Kommentare):

Code: Alles auswählen

class ScrollMessageBoxShowRC(QMessageBox):
   def __init__(self, *args, **kwargs):
       QMessageBox.__init__(self, *args, **kwargs)
       scroll = QScrollArea(self)
       scroll.setWidgetResizable(True)
       self.content = QWidget()
       scroll.setWidget(self.content)
       lay = QVBoxLayout(self.content)

       dlts = {} #Ich will in btnstateDel ein Dictionary erzeugen {Objektname : isCheckboxChecked}
       
       for rc in dbaccess.allRC(): #Hier fülle ich das Widget mit n Buttons und n Checkboxen.
          dlt = QCheckBox('delete', self)
          dlt.stateChanged.connect(partial(self.btnstateDel, dlt, dlts))
          dlt.setObjectName(rc[9])
 
          qb = QPushButton(rc[9], self)
          lay.addWidget(qb)
          lay.addWidget(dlt)
 
       self.buttonClicked.connect(self.msgButtonClickDel)   
       self.layout().addWidget(scroll, 0, 0, 1, self.layout().columnCount())
       self.setStyleSheet("QScrollArea{min-width:410 px; min-height: 600px}")

   def btnstateDel(self, dlt, dlts):
       dlts[dlt.objectName()] = dlt.isChecked()

  #Wenn ich nun auf dem "obersten" Widget "OK" drücke, will ich auf das dictionary namens dlts zugreifen:
   def msgButtonClickDel(self, i, dlts):
       if i.text() == "OK":
           #print(dlts) Geht nicht...
           #print(self.dlts) ...so geht es auch nicht.

Leider kann ich in der Methode msgButtonClickDel nicht auf das Dictionary dlts zugreifen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du legst ja auch keine Instanzvariable an. Dazu musst du das Wörterbuch schon an self binden.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du solltest dringend an der Benennung Deiner Variablen arbeiten. Du willst es dem Leser (also auch Dir selbst) besonders schwer machen. dlts? lay statt layout.
Statt den Status direkt zu speichern, speichere alle Checkboxen in einem Wörterbuch und frage deren Status bei Bedarf ab.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was heisst denn ”geht nicht”? Du reichst `dlts` als Argument in die Methode rein. Was genau ”geht” denn da nun ”nicht”?

Auch schlimm ist `i` für etwas anderes als ganze Zahlen. Und magische Indexwerte (auch noch kombiniert mit schlechten Namen): ``rc[9]``. Was ist an dem ferngesteuerten Auto Nummer 9 so besonderes? Wobei, Auto? Heute vielleicht eher Drohne. Das solltest Du klarer machen und das `rcc` oder `rcd` nennen. 😈

Ebenfalls eine schlechte Idee ist es Programmlogik von dem Text abhängig zu machen, der auf Widgets angezeigt wird. Dann schreibt man mal nicht "OK" sondern "Ok" oder gar eine Beschriftung in einer anderen Sprache, oder $GOTT bewahre, man internationalisiert die Anwendung und welche Sprache da letztlich auf dem Anzeigeelement landet, hängt von den Systemeinstellungen des Benutzers ab.

Das mit dem `objectName` von Qt sieht auch ein bisschen nach Missbrauch aus. Das ist was um zwischen Designer und Anwendung zu kommunizieren, eher nicht um innerhalb der Anwendung zu kommunizieren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten