Правильное завершение работы диалогового окна pyqt5

Возникла проблема с правильным завершением работы диалогового окна, а именно, при нажатии на кнопку pushButton_save, вываливается окно QMessageBox.information функции def ok_save_log, при нажатии на кнопку ОК работа диалогового окна не завершается, а начинается отработка функции def closeEvent.

Как это должно работать в итоге:

  1. при нажатии на крестик диалогового окна, должна отрабатывать функция def closeEvent.
  2. при нажатии на кнопку ОК в QMessageBox.information функции def ok_save_log работа диалогового окна должна завершаться.
  3. при нажатии на кнопку pushButton_cancel должна повторяться работа п.1.

P.S. кнопка pushButton_cancel работает правильно.

class DialogWindow(QDialog, Ui_form_dialog_adress):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        DialogWindow.setFixedSize(self, 440, 161)

        self.pushButton_save.clicked.connect(self.ok_save_log)
        self.pushButton_cancel.clicked.connect(self.cancel_save_log)

    def ok_save_log(self):
        """Функция действия при нажатии на кнопку "Сохранить" """
        if self.lineEdit_adress.text():
            input_text = self.lineEdit_adress.text()
        else:
            now = datetime.datetime.now()
            input_text = "scannig_" + now.strftime("%d.%m.%Y-%H:%M:%S")

        create_exel_file(input_text)
        check = create_exel_file(input_text)
        if check == 1:
            QMessageBox.information(
                self,
                'Информация',
                "Файл успешно сохранен, проверяйте",
                QMessageBox.Ok
            )
            if QMessageBox.Ok:
                super(DialogWindow, self).close()
                MainWindow.clearTextEdit

    def cancel_save_log(self):
        """Функция действия при нажатии на кнопку "Отмена" """
        self.close()

    def closeEvent(self, event):
        """Функция закрытия диалогового окна"""
        reply = QMessageBox.question(
            self,
            'Информация',
            "Вы уверены, что хотите выйти без сохранения?",
            QMessageBox.Yes, QMessageBox.No
        )
        if reply == QMessageBox.Yes:
            super(DialogWindow, self).closeEvent(event)
            MainWindow.clearTextEdit
        else:
            event.ignore()

P.S. я понимаю, что переопределил метод в QDialog, но потому, что не знал, как заставить реагировать на нажатие крестика (закрытия окна)


Ответы (1 шт):

Автор решения: S. Nick

Чтобы получать быстрые и правильные ответы, вы должны предоставлять минимально-воспроизводимый пример.
Предоставленный вами пример не является воспроизводимым и требует дополнительного времени, чтобы как-то понять, что такое:

  • create_exel_file(input_text);
  • MainWindow.clearTextEdit.

То что вы называете проблемой - есть результат работы строки:

super(DialogWindow, self).close()

import sys
import datetime
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class Ui_form_dialog_adress(object):
    def setupUi(self, form_dialog_adress):
        form_dialog_adress.setObjectName("form_dialog_adress")
        form_dialog_adress.resize(440, 161)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("im.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        form_dialog_adress.setWindowIcon(icon)
        form_dialog_adress.setLayoutDirection(QtCore.Qt.RightToLeft)
        form_dialog_adress.setStyleSheet("QWidget{\n"
"    background-color: white;\n"
"}")
        self.pushButton_save = QtWidgets.QPushButton(form_dialog_adress)
        self.pushButton_save.setGeometry(QtCore.QRect(60, 100, 120, 41))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/icons_main/save-64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_save.setIcon(icon1)
        self.pushButton_save.setIconSize(QtCore.QSize(40, 40))
        self.pushButton_save.setObjectName("pushButton_save")
        self.pushButton_cancel = QtWidgets.QPushButton(form_dialog_adress)
        self.pushButton_cancel.setGeometry(QtCore.QRect(260, 100, 120, 41))
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(":/icons_main/cancel-64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_cancel.setIcon(icon2)
        self.pushButton_cancel.setIconSize(QtCore.QSize(40, 40))
        self.pushButton_cancel.setObjectName("pushButton_cancel")
        self.label_adress = QtWidgets.QLabel(form_dialog_adress)
        self.label_adress.setGeometry(QtCore.QRect(10, 10, 420, 30))
        self.label_adress.setBaseSize(QtCore.QSize(0, 30))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label_adress.setFont(font)
        self.label_adress.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.label_adress.setAlignment(QtCore.Qt.AlignCenter)
        self.label_adress.setObjectName("label_adress")
        self.lineEdit_adress = QtWidgets.QLineEdit(form_dialog_adress)
        self.lineEdit_adress.setGeometry(QtCore.QRect(10, 50, 420, 30))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.lineEdit_adress.setFont(font)
        self.lineEdit_adress.setText("")
        self.lineEdit_adress.setObjectName("lineEdit_adress")

        self.retranslateUi(form_dialog_adress)
        QtCore.QMetaObject.connectSlotsByName(form_dialog_adress)

    def retranslateUi(self, form_dialog_adress):
        _translate = QtCore.QCoreApplication.translate
        form_dialog_adress.setWindowTitle(_translate("form_dialog_adress", "Aдрес местонахождения"))
        self.pushButton_save.setText(_translate("form_dialog_adress", "Сохранить"))
        self.pushButton_cancel.setText(_translate("form_dialog_adress", "Отмена"))
        self.label_adress.setText(_translate("form_dialog_adress", "Введите адрес местонахождения:"))


class DialogWindow(QDialog, Ui_form_dialog_adress):
    def __init__(self, parent=None):                                      # +++ parent
        super(DialogWindow, self).__init__(parent)                        # +++ parent
        
        self.setupUi(self)
        
        self.setFixedSize(440, 161)               # !
        
        self.parent = parent                                              # +++ parent
        self.pushButton_save.clicked.connect(self.ok_save_log)     
        self.pushButton_cancel.clicked.connect(self.cancel_save_log) 

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def ok_save_log(self):
        #print(f'Функция действия при нажатии на кнопку "Сохранить"')
        if self.lineEdit_adress.text():
            input_text = self.lineEdit_adress.text()
        else:
            now = datetime.datetime.now()
            input_text = "scannig_" + now.strftime("%d.%m.%Y-%H:%M:%S")

# ???   create_exel_file(input_text)
# ???   check = create_exel_file(input_text)  
# ----> vvvvv   ^^^^^^^^^^^^^^^^ <-------------------------------- что это ???
        check = 1           # для тестирования, попробуйте поставить не равное 1                                   
        if check == 1:
            QMessageBox.information(
                self,
                'Информация',
                "Файл успешно сохранен, проверяйте",
                QMessageBox.Ok
            )
# ??? зачем это
# ???            if QMessageBox.Ok:
# ???                super(DialogWindow, self).close()
# ???                 MainWindow.clearTextEdit                            # ??? 

            self.parent.clearTextEdit()                                   # +++ parent
        
            self.parent.textEdit.append(                                  # +++ parent
                f'Функция действия при нажатии на кнопку "Сохранить"'
                f'\n\tinput_text = {input_text}'
            )

        else:
            QMessageBox.information(
                self,
                'Что-то пошло не так!',
                "Значение `check` не равно 1",
                QMessageBox.Ok
            )
            
        self.hide()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def cancel_save_log(self):
        """Функция действия при нажатии на кнопку "Отмена" """
        self.close()

    def closeEvent(self, event):
        """Функция закрытия диалогового окна"""
        reply = QMessageBox.question(
            self,
            'Информация',
            "Вы уверены, что хотите выйти без сохранения?",
            QMessageBox.Yes, QMessageBox.No
        )
        if reply == QMessageBox.Yes:
            super(DialogWindow, self).closeEvent(event)
# ???             MainWindow.clearTextEdit                                # ??? 
            self.parent.clearTextEdit()                                   # +++ parent
        else:
            event.ignore()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()  

        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)
        
        self.pushButton = QtWidgets.QPushButton('Вызвать диалог')
        self.pushButton.clicked.connect(self.run_dialog)   
        
        self.textEdit = QtWidgets.QTextEdit()

        layout = QVBoxLayout(self.centralwidget)
        layout.addWidget(self.textEdit)
        layout.addWidget(self.pushButton)
        
        self.dialogWindow = DialogWindow(self)                           # !!! self

    def run_dialog(self):
        self.dialogWindow.lineEdit_adress.setFocus()
        self.dialogWindow.exec()                                         # !!!
        
    def clearTextEdit(self):                                             # +++
        print(f'def clearTextEdit(self): ?????????')
        
            
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.setFixedSize(680, 572)
    main_window.show()
    sys.exit(app.exec_())            
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            

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

→ Ссылка