隐藏PyQt应用程序的任务栏图标

14

我是PyQt的初学者。我试图创建一个简单的应用程序来尝试一些工具包的许多功能。我的问题是,如何隐藏任务栏中的应用程序图标? 我不希望用户能够在任务栏中看到该图标并使用该图标将其最小化。是否有任何窗口标志可以使用以实现此目的?


可能是PyQt4最小化到托盘的重复问题。 - Katriel
1
@katrielalex:我认为他指的是任务栏图标而不是托盘图标。 - user225312
1
@PulpFiction:是的,实现“最小化到托盘”的方法是隐藏任务栏图标并创建一个托盘图标。 - Katriel
@katrielalex 是的,我的意思是在应用程序没有最小化的情况下隐藏任务栏图标。 - eternalthinker
7个回答

13

这应该可以解决问题:

myApp.setWindowFlags(QtCore.Qt.Tool)

2

这让我苦恼了数天。下面是完整的应用程序代码实现。

关键点:

  • 重载closeEvent(),使其能够隐藏窗口或真正退出
  • 创建某种机制,让用户选择隐藏或退出行为
  • 在实例化时不显示主窗口,只需执行App
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_()

1

this thread改编:

import sys
from PyQt4.QtGui import *

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

    widget = QWidget()

    mainWindow = QMainWindow(widget)
    mainWindow.show()

    sys.exit(app.exec_())

0
我不建议尝试隐藏应用程序的任务栏存在,特别是当应用程序是可见的时候。如果您只想防止从任务栏最小化,则可以通过使用以下窗口标志创建顶级小部件来实现:
QWidget *mainWindow = new QWidget(0, Qt::CustomizeWindowHint 
    | Qt::WindowTitleHint | Qt::WindowSystemMenuHint 
    | Qt::WindowCloseButtonHint | Qt::WindowMaximizeButtonHint);

如果您不想要最大化标志,您可以将其从列表中省略。

Qt 可以使用的各种窗口标志在此处(Qt::WindowFlags)有文档记录。


0

如果您使用的是带有Unity的Ubuntu,并且想要从左侧的启动器中隐藏应用程序图标,则可能需要Qt.SplashScreen。这对我有用,但我不记得是否还需要Qt.Tool,在Windows上则足够了。对于SplashScreen尝试,您可能需要重新实现调整大小功能,因为它会禁用QStatusBar(具有SizeGrip)的此功能,例如。

这里是一个小例子,可以尝试窗口标志。


0

只需像这样初始化您的主窗口 self.setWindowFlags(Qt.ToolTip)


0
from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 
from PyQt5 import QtCore
import sys

class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        # this will hide the app from task bar

        self.setWindowFlag(QtCore.Qt.Tool)

        self.setGeometry(60, 60, 800, 500)

        # creating a label widget
        # by default label will display at top left corner
        self.label_1 = QLabel('no task bar', self)

        # moving position
        self.label_1.move(100, 100)

        # show all the widgets
        self.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接