从任务栏隐藏窗口
我正在尝试把一个窗口最小化到系统托盘,但它似乎不愿意从任务栏上消失。我花了一些时间,把问题的代码简化成这样。代码不多,所以我在想是不是需要其他东西才能在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_()
看起来应用的图标是隐藏了,但又会弹出另一个图标。如果我多次点击任务栏的图标,就会看到这两个图标闪烁,刚开始的那个图标在隐藏之前,会像这样闪现一下:
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()