Seite 1 von 1

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

Verfasst: Sonntag 12. Dezember 2021, 09:02
von AFX
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.

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

Verfasst: Sonntag 12. Dezember 2021, 09:22
von __deets__
Du legst ja auch keine Instanzvariable an. Dazu musst du das Wörterbuch schon an self binden.

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

Verfasst: Sonntag 12. Dezember 2021, 10:13
von Sirius3
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.

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

Verfasst: Sonntag 12. Dezember 2021, 18:09
von __blackjack__
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.