Правильное завершение работы диалогового окна pyqt5
Возникла проблема с правильным завершением работы диалогового окна, а именно,
при нажатии на кнопку pushButton_save, вываливается окно QMessageBox.information функции def ok_save_log, при нажатии на кнопку ОК работа диалогового окна не завершается, а начинается отработка функции def closeEvent.
Как это должно работать в итоге:
- при нажатии на крестик диалогового окна, должна отрабатывать функция
def closeEvent. - при нажатии на кнопку
ОКвQMessageBox.informationфункцииdef ok_save_logработа диалогового окна должна завершаться. - при нажатии на кнопку
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 шт):
Чтобы получать быстрые и правильные ответы, вы должны предоставлять минимально-воспроизводимый пример.
Предоставленный вами пример не является воспроизводимым и требует дополнительного времени, чтобы как-то понять, что такое:
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_())
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
