从任务栏隐藏PyQt应用程序

14 投票
7 回答
9298 浏览
提问于 2025-04-16 06:14

我刚开始学习PyQt,想做一个简单的应用程序来试试这个工具包的各种功能。我的问题是,怎么才能把应用程序的图标从任务栏上隐藏起来?我不想让用户在任务栏上看到这个图标,也不想让他们通过这个图标来最小化应用。有没有什么窗口标志可以用来实现这个呢?

7 个回答

2

这让我困扰了好几天。下面是实现这个功能的完整应用代码。

关键点:

  • 重写 closeEvent() 方法,让它可以选择是只隐藏窗口还是完全退出应用
  • 提供一个选项,让用户可以选择是隐藏窗口还是退出应用
  • 在创建应用时,不要直接显示主窗口,而是直接执行应用
import sys
from PyQt4.QtGui import QAction, QApplication, QFrame, QIcon, \
    QMainWindow, QMenu, QSystemTrayIcon
from PyQt4.QtCore import SIGNAL

class MyApp(QMainWindow):
    def __init__(self, parent, title):
        super(QMainWindow, self).__init__(parent)
        self.exitOnClose = False
        exit = QAction(QIcon(), "Exit", self)
        self.connect(exit, SIGNAL("triggered()"), self.exitEvent)
        self.trayIcon = QSystemTrayIcon(QIcon(), self)
        menu = QMenu(self)
        menu.addAction(exit)
        self.trayIcon.setContextMenu(menu)
        self.connect(self.trayIcon, \
            SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), \
            self.trayIconActivated)
        self.trayIcon.show()
        self.trayIcon.showMessage("MyApp is running!", "Click to open window\nRight click for menu" )

    def trayIconActivated(self, reason):
        if reason == QSystemTrayIcon.Context:
            self.trayIcon.contextMenu().show()
        elif reason == QSystemTrayIcon.Trigger:
            self.show()
            self.raise_()

    def closeEvent(self, event):
        if self.exitOnClose:
            self.trayIcon.hide()
            del self.trayIcon
            event.accept()
        else:
            self.hide()
            event.setAccepted(True)
            event.ignore()

    def exitEvent(self):
        self.exitOnClose = True
        self.close()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myapp = MyApp(None, "My System Tray App")
    app.exec_()
14

这样做就可以了:

myApp.setWindowFlags(QtCore.Qt.Tool)
1

改编自 这个讨论帖:

import sys
from PyQt4.QtGui import *

if __name__ == '__main__':
    app = QApplication(sys.argv)

    widget = QWidget()

    mainWindow = QMainWindow(widget)
    mainWindow.show()

    sys.exit(app.exec_())

撰写回答