PySide / PyQt 如何检测用户尝试关闭窗口

40

有没有一种方法可以检测用户尝试关闭窗口? 例如,在Tkinter中,我们可以像这样做:

def exit_dialog():
    #do stuff
    pass

root = Tk()
root.protocol("WM_DELETE_WINDOW", exit_dialog)
root.mainloop()

谢谢。

2个回答

106

在你的主窗口中覆盖closeEvent方法。

例如:

class MainWindow(QWidget): # or QMainWindow
    ...

    def closeEvent(self, event):
        # do stuff
        if can_exit:
            event.accept() # let the window close
        else:
            event.ignore()

另一种可能性是使用 QApplicationaboutToQuit 信号,代码如下:
app = QApplication(sys.argv)
app.aboutToQuit.connect(myExitHandler) # myExitHandler is a callable

7
请注意,这种方法在主线程繁忙计算时无法使用。为了能够关闭窗口,应将计算移至另一个线程中进行。 - d33tah
2
请注意,在QMainWindow上没有canExit属性。 - Tcll
2
@Tcll,在Qt库中没有任何属性(据我所知,但绝对不在QWidget或QMainWindow中)。这就是重点:您将其定义为自定义处理程序。 - Alex Huszagh
在使用Qt Designer定义.ui文件,使用pyside-uic将其转换为不需要手动编辑的.py文件以及另一个用于实现用户UI元素的独立文件时,是否可以在其中一个独立文件中连接“aboutToQuit”? - James Paul Mason

7

如果您只想检测一个窗口(即最后一个窗口),则可以使用 setQuitOnLastWindowClosed 静态函数和 lastWindowClosed 信号。

from PySide2 import QtGui
import sys


def keep_alive():
    print("ah..ah..ah..ah...staying alive...staying alive")
    window.setVisibility(QtGui.QWindow.Minimized)


if __name__ == '__main__':
    app = QtGui.QGuiApplication()
    app.setQuitOnLastWindowClosed(False)
    app.lastWindowClosed.connect(keep_alive)

    window = QtGui.QWindow()
    window.show()

    sys.exit(app.exec_())

希望这对某些人有所帮助,对我来说它有效,因为在第一次尝试中我无法覆盖closeEvent(),由于缺乏经验!


2
在你的打印中有好歌。 - user14023416

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