Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2017 13:03:56

Lemurio
Зарегистрирован: 2013-02-24
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Как обработать закрытие виджета?

Здравствуйте друзья!
Столкнулся со следующей проблемой, при закрытии виджета нужно выполнить дополнительное действие, но как это сделать не особо понимаю.
Есть главная форма, на которую наброшен виджет:

 from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowModality(QtCore.Qt.NonModal)
        MainWindow.resize(493, 470)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(493, 470))
        MainWindow.setMaximumSize(QtCore.QSize(493, 470))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.server_list = QtWidgets.QListWidget(self.centralwidget)
        self.server_list.setGeometry(QtCore.QRect(0, -6, 256, 192))
        self.server_list.setObjectName("server_list")
        self.run_button = QtWidgets.QPushButton(self.centralwidget)
        self.run_button.setGeometry(QtCore.QRect(430, 340, 75, 33))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.run_button.sizePolicy().hasHeightForWidth())
        self.run_button.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.run_button.setFont(font)
        self.run_button.setObjectName("run_button")
        self.setting_widget = QtWidgets.QWidget(self.centralwidget)
        self.setting_widget.setGeometry(QtCore.QRect(120, 10, 391, 195))
        self.setting_widget.setMinimumSize(QtCore.QSize(391, 195))
        self.setting_widget.setMaximumSize(QtCore.QSize(391, 195))
        self.setting_widget.setBaseSize(QtCore.QSize(391, 200))
        self.setting_widget.setObjectName("setting_widget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.setting_widget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 391, 414))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.vertical_layout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.vertical_layout.setContentsMargins(5, 5, 5, 5)
        self.vertical_layout.setSpacing(5)
        self.vertical_layout.setObjectName("vertical_layout")
        self.dir_label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setFamily("Nirmala UI")
        font.setPointSize(9)
        self.dir_label_2.setFont(font)
        self.dir_label_2.setObjectName("dir_label_2")
        self.vertical_layout.addWidget(self.dir_label_2)
        self.files_for_copy_widget = QtWidgets.QWidget(self.verticalLayoutWidget)
        self.files_for_copy_widget.setMinimumSize(QtCore.QSize(311, 231))
        self.files_for_copy_widget.setMaximumSize(QtCore.QSize(350, 250))
        self.files_for_copy_widget.setObjectName("files_for_copy_widget")
        self.edit_row_button = QtWidgets.QPushButton(self.files_for_copy_widget)
        self.edit_row_button.setGeometry(QtCore.QRect(40, 10, 31, 23))
        self.edit_row_button.setText("")
        self.edit_row_button.setObjectName("edit_row_button")
        self.delete_row_button = QtWidgets.QPushButton(self.files_for_copy_widget)
        self.delete_row_button.setGeometry(QtCore.QRect(80, 10, 31, 23))
        self.delete_row_button.setText("")
        self.delete_row_button.setObjectName("delete_row_button")
        self.add_row_button = QtWidgets.QPushButton(self.files_for_copy_widget)
        self.add_row_button.setGeometry(QtCore.QRect(0, 10, 31, 23))
        self.add_row_button.setText("")
        self.add_row_button.setObjectName("add_row_button")
        self.tableWidget = QtWidgets.QTableWidget(self.files_for_copy_widget)
        self.tableWidget.setGeometry(QtCore.QRect(0, 40, 311, 192))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.vertical_layout.addWidget(self.files_for_copy_widget)
        self.horizontalLayout_ = QtWidgets.QHBoxLayout()
        self.horizontalLayout_.setObjectName("horizontalLayout_")
        self.dir_line_edit_2 = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        self.dir_line_edit_2.setObjectName("dir_line_edit_2")
        self.horizontalLayout_.addWidget(self.dir_line_edit_2)
        self.dir_button_dial_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.dir_button_dial_2.setObjectName("dir_button_dial_2")
        self.horizontalLayout_.addWidget(self.dir_button_dial_2)
        self.vertical_layout.addLayout(self.horizontalLayout_)
        self.ini_label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.ini_label_2.setObjectName("ini_label_2")
        self.vertical_layout.addWidget(self.ini_label_2)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.ini_line_edit_2 = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        self.ini_line_edit_2.setObjectName("ini_line_edit_2")
        self.horizontalLayout_6.addWidget(self.ini_line_edit_2)
        self.ini_button_dial_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.ini_button_dial_2.setObjectName("ini_button_dial_2")
        self.horizontalLayout_6.addWidget(self.ini_button_dial_2)
        self.vertical_layout.addLayout(self.horizontalLayout_6)
        self.exe_label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.exe_label_2.setObjectName("exe_label_2")
        self.vertical_layout.addWidget(self.exe_label_2)
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        self.exe_line_edit_2 = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        self.exe_line_edit_2.setObjectName("exe_line_edit_2")
        self.horizontalLayout_7.addWidget(self.exe_line_edit_2)
        self.exe_button_dial_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.exe_button_dial_2.setObjectName("exe_button_dial_2")
        self.horizontalLayout_7.addWidget(self.exe_button_dial_2)
        self.vertical_layout.addLayout(self.horizontalLayout_7)
        self.save_button = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.save_button.setObjectName("save_button")
        self.vertical_layout.addWidget(self.save_button)
        self.clear_log_button = QtWidgets.QPushButton(self.centralwidget)
        self.clear_log_button.setGeometry(QtCore.QRect(410, 420, 121, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.clear_log_button.setFont(font)
        self.clear_log_button.setObjectName("clear_log_button")
        self.add_server_widget = QtWidgets.QWidget(self.centralwidget)
        self.add_server_widget.setGeometry(QtCore.QRect(20, 210, 211, 71))
        self.add_server_widget.setMinimumSize(QtCore.QSize(211, 71))
        self.add_server_widget.setMaximumSize(QtCore.QSize(211, 71))
        self.add_server_widget.setObjectName("add_server_widget")
        self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.add_server_widget)
        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 211, 71))
        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
        self.verticalLayout_2.setContentsMargins(5, 0, 5, 0)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.server_line_edit = QtWidgets.QLineEdit(self.verticalLayoutWidget_2)
        self.server_line_edit.setObjectName("server_line_edit")
        self.verticalLayout_2.addWidget(self.server_line_edit)
        self.save_servers_button = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
        self.save_servers_button.setObjectName("save_servers_button")
        self.verticalLayout_2.addWidget(self.save_servers_button)
        self.update_client_button = QtWidgets.QPushButton(self.centralwidget)
        self.update_client_button.setGeometry(QtCore.QRect(380, 380, 171, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.update_client_button.setFont(font)
        self.update_client_button.setObjectName("update_client_button")
        self.log_text_viewer = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.log_text_viewer.setGeometry(QtCore.QRect(400, 80, 256, 192))
        font = QtGui.QFont()
        font.setPointSize(8)
        self.log_text_viewer.setFont(font)
        self.log_text_viewer.setReadOnly(True)
        self.log_text_viewer.setPlainText("")
        self.log_text_viewer.setObjectName("log_text_viewer")
        self.file_from_to_widget = QtWidgets.QWidget(self.centralwidget)
        self.file_from_to_widget.setGeometry(QtCore.QRect(10, 290, 301, 131))
        self.file_from_to_widget.setObjectName("file_from_to_widget")
        self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.file_from_to_widget)
        self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(-1, 9, 301, 121))
        self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
        self.verticalLayout_3.setContentsMargins(5, 5, 5, 5)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.horizontalLayout_1 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_1.setObjectName("horizontalLayout_1")
        self.file_from = QtWidgets.QLineEdit(self.verticalLayoutWidget_3)
        self.file_from.setReadOnly(True)
        self.file_from.setClearButtonEnabled(False)
        self.file_from.setObjectName("file_from")
        self.horizontalLayout_1.addWidget(self.file_from)
        self.file_from_button = QtWidgets.QPushButton(self.verticalLayoutWidget_3)
        self.file_from_button.setObjectName("file_from_button")
        self.horizontalLayout_1.addWidget(self.file_from_button)
        self.verticalLayout_3.addLayout(self.horizontalLayout_1)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.file_to = QtWidgets.QLineEdit(self.verticalLayoutWidget_3)
        self.file_to.setReadOnly(True)
        self.file_to.setClearButtonEnabled(False)
        self.file_to.setObjectName("file_to")
        self.horizontalLayout_2.addWidget(self.file_to)
        self.file_to_button = QtWidgets.QPushButton(self.verticalLayoutWidget_3)
        self.file_to_button.setObjectName("file_to_button")
        self.horizontalLayout_2.addWidget(self.file_to_button)
        self.verticalLayout_3.addLayout(self.horizontalLayout_2)
        self.save_box = QtWidgets.QDialogButtonBox(self.verticalLayoutWidget_3)
        self.save_box.setOrientation(QtCore.Qt.Horizontal)
        self.save_box.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.save_box.setCenterButtons(True)
        self.save_box.setObjectName("save_box")
        self.verticalLayout_3.addWidget(self.save_box)
        self.setting_widget.raise_()
        self.server_list.raise_()
        self.run_button.raise_()
        self.clear_log_button.raise_()
        self.add_server_widget.raise_()
        self.update_client_button.raise_()
        self.log_text_viewer.raise_()
        self.file_from_to_widget.raise_()
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 493, 21))
        self.menubar.setObjectName("menubar")
        self.settings_menu = QtWidgets.QMenu(self.menubar)
        self.settings_menu.setObjectName("settings_menu")
        MainWindow.setMenuBar(self.menubar)
        self.menubar.addAction(self.settings_menu.menuAction())
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Смена сервера"))
        self.run_button.setText(_translate("MainWindow", "Пуск!"))
        self.dir_label_2.setText(_translate("MainWindow", "Локальная папка (КЭШ)"))
        self.dir_button_dial_2.setText(_translate("MainWindow", "Обзор"))
        self.ini_label_2.setText(_translate("MainWindow", "Путь к .ini файлу программы"))
        self.ini_button_dial_2.setText(_translate("MainWindow", "Обзор"))
        self.exe_label_2.setText(_translate("MainWindow", "Путь к .exe файлу программы"))
        self.exe_button_dial_2.setText(_translate("MainWindow", "Обзор"))
        self.save_button.setText(_translate("MainWindow", "Сохранить"))
        self.clear_log_button.setText(_translate("MainWindow", "Очистить"))
        self.save_servers_button.setText(_translate("MainWindow", "Сохранить"))
        self.update_client_button.setText(_translate("MainWindow", "Обновить клиента"))
        self.file_from.setPlaceholderText(_translate("MainWindow", "Откуда копировать?"))
        self.file_from_button.setText(_translate("MainWindow", "Обзор"))
        self.file_to.setPlaceholderText(_translate("MainWindow", "Куда копировать?"))
        self.file_to_button.setText(_translate("MainWindow", "Обзор"))
        self.settings_menu.setTitle(_translate("MainWindow", "Настройки"))

Для работы с формой сделал свой класс, в котором унаследовал Ui_MainWindow и QMainWindow.
Допустим мне нужно чтобы после закрытия “files_for_copy_widget”, в консоль вывелось“Hello World”

 class MainForm(QMainWindow, Ui_MainWindow):
    def __init__(self):
       try:
            super(MainForm, self).__init__(parent = None)
            self.setupUi(self)
           self.file_from_to_widget.setVisible(False)
            self.setWindowIcon(QIcon(WINDOW_ICO))
           
            #настройки контекстного меню
            self.server_list.setContextMenuPolicy(Qt.CustomContextMenu)
            self.server_list.customContextMenuRequested.connect(self.open_con_menu)
            #настройка меню
            self.client_files_to_copy = QAction('Файлы для копирования', self)
            self.client_files_to_copy.triggered.connect(self.choose_file_to_copy)
            self.settings_menu.addAction(self.client_files_to_copy)
       except Exception as e:
           print(e)
# функция для отрисовки виджета
    def choose_file_to_copy(self):
        self.files_for_copy_widget.setWindowFlags(Qt.Dialog | Qt.WindowCloseButtonHint)
        self.files_for_copy_widget.setWindowModality(Qt.WindowModal)
        self.files_for_copy_widget.setWindowTitle('Список файлов для копирования')
        self.grid_ffc_widget = QGridLayout(self.files_for_copy_widget)
        self.grid_ffc_widget.setSpacing(3)
        self.grid_ffc_widget.addWidget(self.add_row_button, 1, 0, 1, 1)
        self.grid_ffc_widget.addWidget(self.edit_row_button, 1, 1, 1, 1)
        self.grid_ffc_widget.addWidget(self.delete_row_button, 1, 2, 1, 1)
        self.grid_ffc_widget.addWidget(self.tableWidget, 2, 0, 1, 3)
        self.files_for_copy_widget.setLayout(self.grid_ffc_widget)
        self.add_row_button.setIcon(QIcon(ADD_ROW_ICO))
        self.edit_row_button.setIcon(QIcon(EDIT_ROW_ICO))
        self.delete_row_button.setIcon(QIcon(DELETE_ROW_ICO))
        table = self.tableWidget
        table.setColumnCount(2)
        table.setHorizontalHeaderLabels(['Откуда копировать','Куда копировать'])
        table.setColumnWidth(0, table.width() / 2)
        table.setColumnWidth(1, table.width() / 2)
               
        self.files_for_copy_widget.setVisible(True)
Можете подсказать как реализовать отслеживание закрытия (или скрытия) “files_for_copy_widget” (точнее как переопределить события для виджета, а не для основного окна) ?

Офлайн

#2 Дек. 28, 2017 13:18:38

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Как обработать закрытие виджета?

 >>> from PyQt5.Qt import *
>>> class W(QWidget):
	def __init__(self):
		QWidget.__init__(self)
		print('i am open')
	def closeEvent(self,e):
		print('I am closed')
		e.accept()
		
>>> app = QApplication([])
>>> w = W()
i am open
>>> w.show()
>>> app.exec_()
I am closed
http://python.su/forum/topic/6225/?page=2

Отредактировано vic57 (Дек. 28, 2017 13:44:48)

Офлайн

#3 Дек. 28, 2017 13:21:10

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Как обработать закрытие виджета?

Читай про модальные диалоги и QDialog.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version