如何隐藏PyQt4 Python应用程序的任务栏图标?

5
我想创建一个Windows桌面小部件。我会在Qt设计师中为小部件创建自定义UI,并使用Python添加功能。但是,我不想让应用程序在任务栏上有图标。我应该如何修改代码,使我的应用程序(及其实例或其他类似应用程序)没有任务栏痕迹?
我如何在Windows上隐藏任务栏图标?以下是示例代码:
import sys
from PyQt4 import QtGui
from PyQt4.uic import loadUiType

Ui_MainWindow, QMainWindow = loadUiType('try.ui')

class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()
    sys.exit(app.exec_())

这是它的用户界面,即“try.ui”:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>211</width>
    <height>157</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>60</x>
     <y>60</y>
     <width>75</width>
     <height>23</height>
    </rect>
   </property>
   <property name="text">
    <string>PushButton</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

编辑:这里 是任务栏上默认图标的样子。我不希望它出现在那里,因为这是小部件应该有的特性。

图标看起来怎么样?它上面写了什么?这是默认的Python Windows图标吗? - oxalorg
@MiteshNinja:这只是任务栏上显示的普通默认图标,但我不想让它出现在那里,也找不到隐藏它的方法。 - smoothy
2个回答

4

试试这个:

from PyQt4 import QtCore
...
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setWindowFlags(QtCore.Qt.Tool)       #This

谢谢Stevo,就是这样。不过我想注意一下这个方法有点有趣:当我运行第二个实例时,第一个实例会消失,如果我运行几个更多的实例并点击桌面,它们都会从屏幕上消失。然而,在后续的尝试中,一切都正常了。我现在不知道是什么原因导致的,但你的答案解决了我的问题,我接受了它。你也知道如何同时使应用程序无框架吗?这将更像一个小部件。 - smoothy
我认为这是一个全新的问题,但是快速的答案是使用相同的方法:setWindowFlags(QtCore.Qt.FramelessWindowHint) - Stevo Mitric

1

我认为this可能是问题所在:

在Windows 7中,任务栏不是针对“应用程序窗口”本身的, 而是针对“应用程序用户模型”的。例如,如果您有多个不同的应用程序实例正在运行, 每个实例都有自己的图标,则它们将全部分组在单个任务栏图标下。 Windows使用各种启发式方法来决定是否应该分组不同的实例, 在这种情况下,它决定将由Pythonw.exe托管的所有内容分组到Pythonw.exe图标下。

正确的解决方案是让Pythonw.exe告诉Windows它只是托管其他应用程序。 也许未来的Python版本会这样做。或者,您可以添加一个注册表键来告诉Windows, Pythonw.exe只是一个主机,而不是一个独立的应用程序。请参阅MSDN文档以获取AppUserModelIDs。

另外,您可以从Python中使用Windows调用,明确告诉Windows此进程的正确AppUserModelID是什么:

import ctypes myappid = 'mycompany.myproduct.subproduct.version' #
arbitrary string
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)

这不是我要找的。我不想让应用程序在任务栏上有图标。我该如何修改我的代码,使我的应用程序(以及它的实例或其他类似的应用程序)没有任务栏印记?这更接近我需要的。谢谢回复。 - smoothy

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