PyQt перехватывает событие закрытия без наследования - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть программа на основе сокетов.Чтобы корректно закрыть соединение на стороне клиента, мне нужно обработать событие close.Однако все закрывающие коды событий, которые я видел на сайте, были написаны с использованием ООП.Поскольку большая часть моего сценария (очень длинного) написана с использованием процедурной парадигмы, я пытался реализовать эти коды, но не смог заставить его работать.Как я могу решить это?

app = QApplication(sys.argv)

v_box = QVBoxLayout()

window = QWidget()
label = QLabel("Hello World")

v_box.addWidget(label)

def closeEvent(event):
    choice = QMessageBox.question( "Quit", "Do you want to quit chit chat?", QMessageBox.Yes | QMessageBox.No)
    if choice == QMessageBox.Yes:
        s.close()
        event.accept()
    else:
        event.ignore()

app.aboutToQuit.connect(closeEvent)
window.setLayout(v_box)
window.show()
sys.exit(app.exec())

1 Ответ

0 голосов
/ 05 февраля 2019

Вам нужно перехватить событие закрытия вашего окна, а не приложения.Правильный способ сделать это - создать класс, который наследует от QWidget или QMainWindow и переопределить closeEvent. Если вы не хотите использовать классы, вы можете использовать functools, как в следующем примере:

import functools
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabel, QMessageBox


def closeEvent(self, event):
    choice = QMessageBox.question(self, "Quit", "Do you want to quit chit chat?", QMessageBox.Yes | QMessageBox.No)
    if choice == QMessageBox.Yes:
        event.accept()
    else:
        event.ignore()


app = QApplication(sys.argv)

v_box = QVBoxLayout()

window = QWidget()

window.closeEvent = functools.partial(closeEvent, window)

label = QLabel("Hello World")

v_box.addWidget(label)

window.setLayout(v_box)
window.show()
sys.exit(app.exec())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...