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())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка