Seite 1 von 1

Widgetklasse wird aus unerfindlichen Gründen doppelt aufgerufen

Verfasst: Freitag 25. Februar 2022, 11:58
von AFX
Ich habe eine Widgetklasse, deren Code ich weiter unten poste. Diese führe ich wie folgt aus:

result = ScrollMessageBoxShowResourceContactsAdd(None)
result.exec_()

Das Problem daei ist, dass, wenn ich den "OK" - Button drücke, ein weiteres Widget, also eine weitere Instanz, erscheint. Beim ersten Drücken von "OK" habe ich zwei Widgets / Fenster, dann drei usw. Wie kommt das? Ich habe den Fehler nicht finden können.

Hier der Code:


Ich habe eine Widgetklasse, deren Code ich weiter unten poste. Diese führe ich wie folgt aus:

Code: Alles auswählen

result = ScrollMessageBoxShowResourceContactsAdd(None)
result.exec_() 

Das Problem daei ist, dass, wenn ich den 

Hier der Code:

[code]
class ScrollMessageBoxShowResourceContactsAdd(QMessageBox):  

   def __init__(self, *args, **kwargs):
       
       def msgbtn(tf, btn):
           if btn.text().upper() == 'SAVE':
               #Hier in die DB schreiben, dann das Ding neu aufrufen. # 
               #dbaccess.updateMainFilterString2("")            
               self.close()

           if btn.text().upper() == 'OK':
               #Hier in die DB schreiben, dann das Ding neu aufrufen. #
               #dbaccess.updateMainFilterString2(tf.text())
               self.close()
               
               print("Warum schließt das Ding nicht?")
               
               result = ScrollMessageBoxShowResourceContactsAdd(None)
               result.exec_()
       
           if not (btn.text().upper() == 'OK' or btn.text().upper() == 'SAVE'):
               sys.exit(self.exec_())
       
       QMessageBox.__init__(self, *args, **kwargs)
       
       self.setWindowTitle("Ressourcenkontakte einsehen oder hinzufügen.")
       
       self.setStandardButtons(QMessageBox.Ok | QMessageBox.Save)

       self.setInformativeText("Filtern: OK drücken. ~ Hinzufügen: Häkchen (od. nicht), dann 'SAVE'")
       
       filtertf = QLineEdit() 
       filtertf.setStyleSheet("background-color: yellow; max-height: 2em; max-width: 22em;");
       self.buttonClicked.connect(partial(msgbtn, filtertf))
       
       scroll = QScrollArea(self)
       scroll.setWidgetResizable(True)
       
       self.content = QWidget()
       
       scroll.setWidget(self.content)
       
       lay = QVBoxLayout(self.content)
       
       delendaDict = {} 
       self.delDict = {}
       
       filterText = "foo" #dbaccess.filterText2()[0][0]
       
       filtertf.setText(filterText)
       
       if filterText == "":
           for rc in []: #Dies ist für das Problem irrelevant. 
               deleteCB = QCheckBox('add', self)
               deleteCB.stateChanged.connect(partial(self.btnstateDel, deleteCB, delendaDict))
               deleteCB.setObjectName(rc[9])
 
               qb = QPushButton(rc[9], self)
               qb.released.connect(partial(self.button_releasedRC, rc[9]))
               lay.addWidget(qb)
               lay.addWidget(deleteCB)
 
       else:
           for rc in []: 
               deleteCB = QCheckBox('add', self)
               deleteCB.stateChanged.connect(partial(self.btnstateDel, deleteCB, delendaDict))
               deleteCB.setObjectName(rc[9])
 
               qb = QPushButton(rc[9], self)
               qb.released.connect(partial(self.button_releasedRC, rc[9]))
               lay.addWidget(qb)
               lay.addWidget(deleteCB)
 
       lay.addWidget(filtertf) 
 
       delete_all_rc = QPushButton('Alle Ressourcenkontakte hinzufügen.', self)
       delete_all_rc.released.connect(partial(self.button_releasedDeAllRC))
       lay.addWidget(delete_all_rc)
       
       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()] = False
       if dlt.isChecked:
           dlts[dlt.objectName()] = True
       self.delDict = dlts

   def msgButtonClickDel(self, i):
       if i.text().upper() == "SAVE":
           #Das hier ist noch zu implementieren.        
           pass
           #dbaccess.deleteRCs2(self.delDict) 

   def button_releasedRC(self, nameshow):
       ScrollMessageBoxRCInfo(QMessageBox.Information, nameshow, '')

   def button_releasedDeAllRC(self):
       #Das hier ist noch zu implementieren.
       pass
       #dbaccess.deleteAllRCs()
       self.close()

Re: Widgetklasse wird aus unerfindlichen Gründen doppelt aufgerufen

Verfasst: Freitag 25. Februar 2022, 12:01
von __deets__
Du erzeugst den doch andauernd neu. Direkt hinter deinem print. Was sonst soll denn dann passieren?

Re: Widgetklasse wird aus unerfindlichen Gründen doppelt aufgerufen

Verfasst: Freitag 25. Februar 2022, 12:38
von AFX
Vielen Dank für die rasche Antwort - mein Plan war es, das Ding zu schließen mit "self.close()" und dann durch die neue Erzeugung es erneut zu öffnen. Oder gibt es da einen Hack, das Ding zu schließen und es erneut zu öffnen (sodass dann auch neu in die Datenbank geschriebene Werte frisch ausgelesen werden)?

Re: Widgetklasse wird aus unerfindlichen Gründen doppelt aufgerufen

Verfasst: Freitag 25. Februar 2022, 13:41
von __deets__
Ordentlich machen? Statt eine profund ätzende Interaktion, bei der sich das immer gleiche Fenster schließt und öffnet und schließt und öffnet und schließt und öffnet und schließt….

Re: Widgetklasse wird aus unerfindlichen Gründen doppelt aufgerufen

Verfasst: Freitag 25. Februar 2022, 17:29
von __blackjack__
Zumal das nicht mal ein Parent hat, womit in der Regel die Fensterverwaltung des Systems entscheidet wo das Fenster aufgeht. Und zwar jedes mal neu. Wenn man Glück hat, ist das immer an der gleichen Stelle. Wenn nicht, nervt das *noch* mehr.