PyQt拦截关闭事件而不继承

3

我有一个基于套接字的程序。为了在客户端上以一种优雅的方式关闭连接,我必须处理关闭事件。然而,我在网站上看到的所有关闭事件代码都是使用面向对象编写的。由于我的脚本大部分(非常长)是使用过程式范例编写的,我已经尝试实现了那些代码,但无法使其工作。我该怎么解决这个问题?

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

这与函数式编程无关。你正在做的是过程式编程。我已经更新了你的问题 ;) - Isma
谢谢。对不起,我的概念混乱了 :) - suleymanyaman
1个回答

2

您需要拦截窗口的关闭事件,而不是应用程序。一种方法是创建一个继承自QWidgetQMainWindow的类并覆盖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())

谢谢,它起作用了!我不知道self也可以在过程式编程中使用。 - suleymanyaman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接