pyQt5 处理多个 windows

pyQt5 handling multiple windows

一个我无法解决的简单问题,因为我是使用 pyQt 的新手... 我有一个应用程序,它有一个 window 和一个 QPushButton1,当它被点击时它会打开第二个 window 和另一个 QPushButton2。发生的事情是当我关闭第二个 window 按 'x' 并返回到第一个时,如果我再次单击 QPushButton1,第二个 window 不会打开。只有当我再点击一个 QPushButton1 时,第二个 window 才会打开。也许我需要在第二个 window 关闭时设置 self.w(second window) = None ,但我不知道把它放在哪里。感谢您的帮助

class MainWindow(QWidget, Ui_f_tabella):

def __init__(self):
    super().__init__()
    
    self.setupUi(self)
    self.w = None # No external window yet.
    self.pb_Ins.clicked.connect(self.inserimento_mat)
   
def inserimento_mat(self):

  if self.w is None:    
     self.w = InserimentoMateriali()
     self.w.show()
     self.w.pb_conf.clicked.connect(self.conferma_inserimento_materiali)  
  else:
     self.w.close()
     self.w = None # Discard reference, close window.

def conferma_inserimento_materiali(self):
   """Aggiunta nuova risorsa"""   

   self.data = []
   for field in (self.w.lE_descMat, self.w.dSB_pesoSp):    
        
        if not field.text():
            QMessageBox.critical(
                self,
                "Errore!",
                f"Inserimento non consentito per mancanza di informazioni"   
                #f"Inserire il valore {field.objectName()}",
            )
            self.data = None  # Reset .data
            return

        self.data.append(field.text())

   if not self.data:
        return

   rec = self.model.record()
   rows = self.model.rowCount()

   for column_index, field in enumerate(self.data): 
      if rec.fieldName(column_index)=="ps_mat":
         x = field.replace(",", ".")
         field=x

      rec.setValue(rec.fieldName(column_index), field)     

   if(self.model.insertRecord(-1, rec)):
     self.model.submitAll() 
     self.model.select()
     QMessageBox.information(self, "Conferma inserimento",
                f"Inserimento nuovo materiale effettuato") 
     self.w.close()
     self.w = None           
   else:
     msg="Errore inserimento nuovo materiale: <br> <br>" + self.model.lastError().text()
     QMessageBox.critical(self, "ERRORE", msg)

class InserimentoMateriali(QDialog,Ui_InsMateriali):
    def __init__(self):
    super().__init__()
    self.setupUi(self)           

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())enter code here

问题是当使用系统按钮关闭 window 时不会重置您的 self.w,因此不满足 if self.w is None 条件。

一个可能的解决方案是设置 DeleteOnClose 属性并将 destroyed 信号连接到恢复变量的函数。

def inserimento_mat(self):

  if self.w is None:    
     self.w = InserimentoMateriali()
     self.w.setAttribute(Qt.WA_DeleteOnClose)
     self.w.destroyed.connect(self.resetFlag)
     self.w.show()
     self.w.pb_conf.clicked.connect(self.conferma_inserimento_materiali)  
  else:
     self.w.close()

def resetFlag(self):
  self.w = None