2016-06-19 27 views
5

Voglio creare un widget del desktop di Windows. Creerò un'interfaccia utente personalizzata per il widget in Qt Designer e aggiungerò funzionalità utilizzando Python. Ma, non voglio che l'applicazione abbia un'icona sulla barra delle applicazioni. Come dovrei modificare il mio codice e fare in modo che la mia applicazione (e le sue istanze o altre applicazioni simili) non abbiano un footprint della barra delle applicazioni?Come nascondere l'icona della barra delle applicazioni di un'applicazione PyQt4 Python?

Come nascondere l'icona della barra delle applicazioni su Windows? Ecco un esempio di codice:

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

e questa è la sua interfaccia utente, "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 è come icona predefinita appare come sulla barra delle applicazioni. Solo che non lo voglio lì, come previsto da un widget.

+0

Come funziona il icona? Cosa dice? È l'icona predefinita di pythonwindows? – oxalorg

+0

@MiteshNinja: È solo un'icona di default normale visualizzata sulla barra delle applicazioni, ma non la voglio lì e non trovo un modo per nasconderla. – smuti

risposta

3

Prova questa:

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

Grazie, Stevo, è questo. Voglio comunque notare qualcosa di divertente su questo metodo: quando eseguo una seconda istanza, per la prima volta, l'istanza originale scompare, se eseguo un paio di altre istanze e faccio clic sul desktop, scompaiono tutte dallo schermo. Dopo di ciò, tuttavia, nelle prove secondarie, tutto funziona bene. Non so cosa causi questo a questo punto, ma la tua risposta risolve il mio problema e l'ho accettato. Sai anche come rendere l'app senza frame allo stesso tempo? Questo sarebbe più simile a un widget. – smuti

+0

Penso che sia una domanda completamente nuova, ma una rapida risposta sarebbe quella di usare lo stesso metodo: 'setWindowFlags (QtCore.Qt.FramelessWindowHint)' –

0

Penso this può essere il problema:

In Windows 7, la barra delle applicazioni non è per "Applicazione Windows" di per sé, è per "Modelli Applicazione utente". Ad esempio, se sono presenti più istanze dell'applicazione in esecuzione, ognuna delle e ogni istanza ha la propria icona, , verranno raggruppate sotto un'unica icona della barra delle applicazioni . Windows utilizza varie euristiche per decidere se raggruppare o meno le diverse istanze e in questo caso è stato deciso di raggruppare in Pythonw.exe sotto l'icona per Pythonw.exe .

La soluzione corretta è per Pythonw.exe per indicare a Windows che è che ospita solo altre applicazioni. Forse una versione futura di Python farà questo. In alternativa, è possibile aggiungere una chiave di registro per indicare a Windows che Pythonw.exe è solo un host anziché un'applicazione nel proprio . Vedere la documentazione MSDN per AppUserModelIDs.

In alternativa, è possibile utilizzare una chiamata Windows da Python, in modo esplicito dire di Windows quello che il corretto AppUserModelID è per questo processo:

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

Questo non è quello che sto cercando. Non voglio che l'applicazione abbia un'icona sulla barra delle applicazioni. Come dovrei modificare il mio codice e fare in modo che la mia applicazione (e le sue istanze o altre applicazioni simili) non abbiano un footprint della barra delle applicazioni? Questo è più simile a quello di cui ho bisogno. Grazie per la risposta. – smuti