从任务栏隐藏窗口

2 投票
2 回答
3746 浏览
提问于 2025-04-16 07:55

我正在尝试把一个窗口最小化到系统托盘,但它似乎不愿意从任务栏上消失。我花了一些时间,把问题的代码简化成这样。代码不多,所以我在想是不是需要其他东西才能在Windows 7中把我的应用隐藏到托盘里。

import sys, os
from PyQt4 import uic 
from PyQt4.QtGui import QMainWindow, QApplication

class MyClass(QMainWindow):
    def __init__(self, parent = None):
        QMainWindow.__init__(self, parent)
        self.ui = uic.loadUi(os.path.join("gui", "timeTrackerClientGUI.ui"), self)
    def hideEvent(self, event):
        self.hide()
    def showEvent(self, event):
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = MyClass()
    wnd.show()
    app.exec_()

看起来应用的图标是隐藏了,但又会弹出另一个图标。如果我多次点击任务栏的图标,就会看到这两个图标闪烁,刚开始的那个图标在隐藏之前,会像这样闪现一下:

alt text

2 个回答

1

在showEvent()和hideEvent()里调用显示或隐藏的函数其实没有意义,因为这些事件是show()和hide()等函数调用的结果,而不是触发这些事件的原因。如果你想通过点击托盘图标来切换窗口的可见性,可以试试在这个小部件上使用setVisible(!isVisible())。如果你想在用户点击窗口的关闭按钮时隐藏窗口,可以重新实现closeEvent()函数:

MyMainWindow::closeEvent( QCloseEvent* e ) {
    hide();
    e->accept();
}

在Python中,具体是这样的:

def closeEvent(self, event):
    self.hide()
    event.accept()
3

为了让它正常工作,我用了一个比较笨的方法,不过如果有人感兴趣的话,这里是最终的代码。ph是我特定于平台的模块,你可以用platform.name或者类似的函数来代替:

def hideEvent(self, event):
    self.hide()
    if ph.is_windows():
        self.hidden = True
        self.setWindowFlags(Qt.ToolTip)
def showEvent(self, event):
    if ph.is_windows() and self.hidden:
        self.setWindowFlags(Qt.Window)
        self.hidden = False
    self.show()

撰写回答