2016-06-19 31 views
5

Ich möchte ein Windows-Desktop-Widget erstellen. Ich werde eine benutzerdefinierte Benutzeroberfläche für das Widget in Qt Designer erstellen und Funktionalität mit Python hinzufügen. Aber ich möchte nicht, dass die Anwendung überhaupt ein Symbol in der Taskleiste hat. Wie sollte ich meinen Code ändern und festlegen, dass meine Anwendung (und ihre Instanzen oder ähnliche Anwendungen) keinen Footprint für die Taskleiste haben?Wie Taskleiste Symbol einer PyQt4 Python-Anwendung ausblenden?

Wie kann ich das Taskleistensymbol in Windows ausblenden? Hier ist ein Beispiel-Code:

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_()) 

und das ist seine ui "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> 

Edit: Here ist wie Standardsymbol wie in der Taskleiste sieht. Ich will es einfach nicht, wie es von einem Widget erwartet wird.

+0

Wie funktioniert das Symbol aussehen? Was sagt es? Ist es das Standardpythonwindows-Symbol? – oxalorg

+0

@MiteshNinja: Es ist nur ein Standard-Standard-Symbol in der Taskleiste, aber ich will es nicht dort und konnte keine Möglichkeit finden, es zu verstecken. – smuti

Antwort

3

Try this:

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

Danke Stevo, das ist es. Ich möchte jedoch etwas Merkwürdiges über diese Methode bemerken: Wenn ich eine zweite Instanz zum ersten Mal ausführe, verschwindet die ursprüngliche Instanz. Wenn ich mehrere Instanzen ausführe und auf den Desktop klicke, verschwinden sie alle vom Bildschirm. Danach aber in sekundären Studien, alles funktioniert gut. Ich weiß nicht, was das an diesem Punkt verursacht, aber deine Antwort löst mein Problem und ich akzeptierte es. Weißt du auch, wie man die App gleichzeitig rahmenlos macht? Dies wäre mehr wie ein Widget. – smuti

+0

Ich denke, das ist eine ganz neue Frage, aber eine schnelle Antwort wäre die gleiche Methode: 'setWindowFlags (QtCore.Qt.FramelessWindowHint)' –

0

denke ich this das Problem sein kann:

In Windows 7, die Taskleiste ist nicht für "Anwendung Windows" per se, es für "Application User-Model" ist. Zum Beispiel, wenn Sie mehr verschiedene Instanzen Ihrer Anwendung ausgeführt wird, und jede Instanz hat ein eigenes Symbol, dann werden sie alle unter einem einzigen Taskleiste Symbol gruppiert werden. Windows verwendet verschiedene Heuristiken, um zu entscheiden, ob verschiedene Instanzen gruppiert werden sollen oder nicht, und in diesem Fall entschieden, dass alles von pythonw.exe gehostet sollte unter dem Symbol für pythonw.exe gruppiert werden.

Die richtige Lösung ist für Pythonw.exe, um Windows zu sagen, dass es nur andere Anwendungen hostet. Vielleicht wird eine zukünftige Version von Python dies tun. Alternativ können Sie einen Registrierungsschlüssel hinzufügen, um zu sagen, Windows, dass Pythonw.exe nur ein Host ist, anstatt eine Anwendung in sein eigenes Recht. Siehe MSDN-Dokumentation für AppUserModelIDs.

Alternativ können Sie einen Windows-Aufruf von Python, verwenden, um explizit Windows-sagen, was die richtige AppUserModelID für diesen Prozess ist:

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

Das ist nicht was ich suche. Ich möchte nicht, dass die Anwendung überhaupt ein Symbol in der Taskleiste hat. Wie sollte ich meinen Code ändern und festlegen, dass meine Anwendung (und ihre Instanzen oder ähnliche Anwendungen) keinen Footprint für die Taskleiste haben? Das ist mehr wie ich brauche. Danke für Ihre Antwort. – smuti

Verwandte Themen