相关文章推荐
腹黑的铁板烧  ·  JavaScript ...·  4 天前    · 
胡子拉碴的豆腐  ·  vue ...·  4 天前    · 
灰常酷的口罩  ·  在群晖(Synology) ...·  6 月前    · 
气势凌人的香菇  ·  Android ...·  1 年前    · 
当点击 "x "按钮时,应用程序隐藏自己(或最小化它,或只是关闭 "主窗口"),而不是关闭整个应用程序,这很常见。在Mac中,关闭窗口是 "command+w",而关闭应用程序是 "command+q"。它们是不同的。

问题。替换代码0】是不够的。在PyQT5中,我们可以在任何QWindow/QDialog/QWidget中钩住closeEvent并拒绝该事件。我们可以通过 self.hide() 来隐藏该窗口。

def closeEvent(self, event):
  event.reject()
  self.hide()

然而,如果我们这样做,该窗口就变得不可阻挡,因为其他关闭方式(命令+Q或右键点击图标然后退出或通过菜单栏退出)都被阻止了。

潜在的解决方案。

  • Hide the x button. It is an expedient way but is off this question because what I want is to hide the window via x button rather than removing the button.
  • Find a different event other than closeEvent which can distinguish X button from others and block that event. But unforunately I cannot see such events. If there exists the event, maybe I will have another problem[1]
  • Continue to block closeEvent and hook other events that are binded to "command+Q" or "Quit by right click". Then force quit the application in that even hook. In this case my question becomes: can I connect quit or (command+Q) via some Qt objects?
  • Maybe there are other better solutions.
  • 这个帖子可能类似于How to write event for window close(X) button in pyqt4 python但与 "如何用Qt禁用窗口的关闭按钮 "的所谓 "重复 "绝对不同。

    [1].这不是一个大问题,但也是相关的。一旦窗口被隐藏,我们需要一个 "点击任务栏/底座中的图标 "的事件来显示它。是否有一些对象与该事件绑定?

    4 个评论
    我不确定我是否理解你的意思。你想still在使用cmd+q时能够关闭一个窗口/退出程序,但在使用cmd+w或关闭按钮时只是隐藏它?
    @musicamante 正是如此!
    Mh,我似乎记得我遇到过类似的问题,因为我记得重复的closeEvents的奇怪行为。不幸的是,我现在不能运行macOS,但你可以尝试检查一下if设置一个连接到的内部标志aboutToQuit信号实际上已经完成before最后的closeEvent被调用:如果是这样的话,你可以直接检查它是否是自发的。如果该标志已经被设置,则为
    @musicamante 谢谢!目前它对我不起作用,因为在我的情况下,"自发 "总是真的。我将在Windows中尝试。还有,如果我把所有的东西都放在QWidget里而不是QMainWindow里,也许它能工作。
    python
    macos
    pyqt
    event-handling
    pyqt5
    Zealseeker
    Zealseeker
    发布于 2021-02-22
    2 个回答
    alec
    alec
    发布于 2021-02-28
    已采纳
    0 人赞同

    尝试将WA_QuitOnClose设置为False。下面的方法对我有用。

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = QMainWindow()
        window.setCentralWidget(QWidget())
        window.setAttribute(Qt.WA_QuitOnClose, False)
        QShortcut(QKeySequence.Close, window, window.close)
        window.show()
        sys.exit(app.exec_())
        
    嗨 @alec 谢谢。如果我只想关闭窗口(cmd+w)而不关闭整个程序(cmd+q),这很有用。 但我想隐藏窗口,而不是真的关闭它。我提到cmd+w是因为我想把cmd+w和cmd+q区分开来,这样我就能钩住正确的事件。
    Zealseeker
    Zealseeker
    发布于 2021-02-28
    0 人赞同

    检查应用程序是否关闭的方法之一(通过右键点击dock中的图标或cmd+Q)是捕捉应用程序的事件。

    I think the event chain is: Application closing (19) -> Window closing (19) -> AboutToQuit

    因此,如果窗口关闭被阻止了,在AboutToQuit中没有任何帮助。我们只需要捕捉上游的事件,即应用程序关闭。

    class MyApplication(QApplication):
        def event(self, e):
            if e.type() == 19: # Close event
                sys.exit() # Or we can do other things to "force close"
    class MyWindow(QMainWindow):
        def closeEvent(self, e):
            e.ignore()
    if __name__ == '__main__':