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
一个我无法解决的简单问题,因为我是使用 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