PyQt的拦截不继承关闭事件

问题描述 投票:0回答:1

我有一个基于套接字的程序。为了关闭连接以优雅的方式在客户端,我必须处理关闭事件。然而,我在现场看到的所有关闭的事件代码使用OOP写。由于大部分我的脚本(一个很长的一个)的使用程序范例写的,我试图执行这些代码,但不能得到它的工作。我该如何解决这个问题?

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())
python pyqt pyqt5
1个回答
0
投票

您需要截取你的窗口的关闭事件,而不是应用程序。做正确的做法是通过创建从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())
© www.soinside.com 2019 - 2024. All rights reserved.