Durante lo sviluppo di QtNotes, mi sono imbattutto nella necessitàdi utilizzare la try icon. Questa icona rimane nel vassoio di sistema e consente di tenere l’applicazione minimizzata funzionante pur senza lasciarla visibile.

Usare le try icon in PyQt però è leggermente diverso da come si farebbe in C++ (linguaggio nativo delle Qt). Si può dividere il lavoro in due parti:

  1. praparare la finistra principale a gestire la try-icon
  2. creare l’icona e connettere i relativi signal alle funzioni

Il primo punto serve in quanto bisogna implementare il metodo virtuale closeEvent, che viene generato quando viene chiusa la finestra. Questo è necessario in quanto in PyQt4 non è possibile l’ereditarietà multipla. Usando i file .ui per l’interfaccia non è possibile derivare la finestra principale da QMainWindow. Questo si risolve derivando una classe da QtGui.QMainWindow.

class MainWindow(QtGui.QMainWindow):
	def __init__(self):
		QtGui.QMainWindow.__init__(self)
	def closeEvent(self,  ev):
		self.hide()
		systray.showMessage('QtNotes', 'Application minimized')
		ev.ignore()
	def ShowWindow(self):
		self.show()

che chiameremo MainWindow. In questa classe ridefiniamo l’evento closeEvent per nascondere la finestra, mostrare un messaggio (facoltativo ma utile) ed in seguito ignorare l’evento. Questo serve per fare in modo che una volta chiusa la finestra premento il pulsante con la X, la finestra non venga chiusa ma <br />solo nascosta. La funzione ShowWindow serve unicamente per rendere la finestra nuovamente visibile.

In C++ si sarebbe usato un altro metodo. Potendo sfruttare l’ereditarietà multipla, si sarebbe fatta una cosa tipo:

class QtNotes(QtGui.QMainWindow, UI_MainWindow)

Una volta preparata questa classe, si procede come al solito quando si usano i file .ui, tenendo presente che la finestra va creata istanziando la classe MainWindow e non la QtGui.QMainWindow. A questo punto siamo pronti a creare ed utilizzare la try icon. Il codice minimo è questo:

icon=QtGui.QIcon('pixmaps/todo_list.png')
systray=QtGui.QSystemTrayIcon(icon)
menu = QtGui.QMenu()
showAction = menu.addAction('Show')
sep1 = menu.addSeparator()
quitAction = menu.addAction('Quit')
QtCore.QObject.connect(quitAction,  QtCore.SIGNAL("triggered()"), ui.QuitApp)
QtCore.QObject.connect(showAction,  QtCore.SIGNAL("triggered()"), window.ShowWindow)
systray.setContextMenu(menu)
systray.show()

che crea una try-icon, gli associa un context menù (che in questo caso ha solo due voci) e connette i relativi slot alle funzioni che ci interessano. Con questo la creazione di una try-icon funzionante è completa. L’unica cosa che rimane fuor è la possibilità di associare la try icon agli eventi tipo click e double-click del pulsante sinistro del mouse per fargli eseguire delle azioni. Il context menù infatti risponde al tasto destro del mouse.

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

   
© 2011 G.R.Y.S. Suffusion theme by Sayontan Sinha