【问题标题】:PySide / PyQt detect if user trying to close windowPySide / PyQt 检测用户是否试图关闭窗口
【发布时间】:2012-03-04 04:54:18
【问题描述】:

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

def exit_dialog():
    #do stuff
    pass

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

谢谢。

【问题讨论】:

    标签: python pyqt tkinter pyqt4 pyside


    【解决方案1】:

    在主窗口中覆盖QWidgetcloseEvent 方法。

    例如:

    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
    

    【讨论】:

    • 请注意,这在主线程忙于计算时不起作用。应该将计算移到另一个线程才能关闭窗口。
    • 请注意,在 QMainWindow 上,没有属性 canExit
    • @Tcll,Qt 库中的任何地方都没有属性(据我所知,但绝对不在 QWidget 或 QMainWindow 中)。这就是重点:您将其定义为自定义处理程序。
    • 是否可以从仅子类 MainWindow 的单独文件中连接 aboutToQuit,就像使用 Qt Designer 定义 .ui、pyside-uic 将其转换为 . py 你不手动编辑,然后这个单独的文件供用户实现 UI 元素?
    【解决方案2】:

    如果您只想检测一个窗口(即最后一个窗口),则可以使用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(),缺乏经验!

    【讨论】:

    • 印刷中的好歌)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多