PyQt5. Не закрывается окно QDialog
Имеется следующий код (минимально воспроизводимый пример):
close.py
import sys
from PyQt5.QtWidgets import QApplication, QDialog
from PyQt5 import uic
class DialogWindow(QDialog):
def __init__(self):
super().__init__()
uic.loadUi('close.ui', self)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
def accept(self):
print("accept...")
self.close()
def reject(self):
print("reject...")
self.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = DialogWindow()
main_window.show()
sys.exit(app.exec_())
close.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>New Experiment</string>
</property>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="geometry">
<rect>
<x>100</x>
<y>250</y>
<width>193</width>
<height>28</height>
</rect>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
Не смотря на то, что при нажатии на QDialogButtonBox
соответствующие методы (accept()
и reject()
) срабатывают, окно все равно не хочет закрываться. В чем может быть проблема?
UPD: Поменял название методов и сигналы (accept на accept2 и reject на reject2 соотвественно) и все заработало. Может быть дело в родительском классе? Сделал методы accept()
и reject()
приватными, тоже работает...
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Обычно ваша задача выглядит так:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QDialog, QDialogButtonBox, \
QWidget, QLabel, QPushButton, QVBoxLayout
#from PyQt5 import uic
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(100, 250, 193, 28))
self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "New Experiment"))
class DialogWindow(QDialog, Ui_Dialog):
def __init__(self):
super().__init__()
# uic.loadUi('close.ui', self)
self.setupUi(self)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
def accept(self):
self._output = 'Hello accept'
super(DialogWindow, self).accept()
def reject(self):
self._output = 'Hello reject'
super().reject()
def get_output(self):
return self._output
class Window(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel("...")
self.pushButton = QPushButton("Запустить Диалог")
self.pushButton.clicked.connect(self.onDialog)
layout = QVBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.pushButton)
def onDialog(self):
dialog = DialogWindow()
_dialog = dialog.exec_()
if _dialog == DialogWindow.Accepted:
_output = dialog.get_output()
self.label.setText(_output)
elif _dialog == DialogWindow.Rejected:
_output = dialog.get_output()
self.label.setText(_output)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
w = Window()
w.resize(640, 480)
w.show()
sys.exit(app.exec())