PySide/PyQt检测用户是否试图关闭窗口

Sau*_*igh 20 python tkinter pyqt pyqt4 pyside

有没有办法检测用户是否试图关闭窗口?例如,在Tkinter中我们可以这样做:

def exit_dialog():
    #do stuff
    pass

root = Tk()
root.protocol("WM_DELETE_WINDOW", exit_dialog)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ole*_*pin 58

覆盖主窗口中的closeEvent方法QWidget.

例如:

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

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

另一种可能是使用这样QApplicationaboutToQuit信号:

app = QApplication(sys.argv)
app.aboutToQuit.connect(myExitHandler) # myExitHandler is a callable
Run Code Online (Sandbox Code Playgroud)

  • 注意,这在主线程繁忙计算时不起作用.应该将计算移动到另一个线程以便能够关闭窗口. (5认同)
  • 请注意,在 QMainWindow 上,没有属性 `canExit` (2认同)
  • @Tcll,Qt 库中的任何位置都没有属性(据我所知,但绝对不在 QWidget 或 QMainWindow 中)。这就是要点:您将其定义为自定义处理程序。 (2认同)

小智 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_())
Run Code Online (Sandbox Code Playgroud)

希望对某人有所帮助,它对我有用,因为在我第一次尝试时,我无法覆盖 closeEvent(),缺乏经验!

  • 印刷品中的好歌) (2认同)