Найти - Пользователи
Полная версия: PyQt4: рисование на QIcon
Начало » GUI » PyQt4: рисование на QIcon
1
Quard
Не могу разобраться как рисовать на иконке…

Вот кусок кода который я использую
...
self.trayIconPixmap = QtGui.QIcon('img.jpg')
painter = QtGui.QPainter()
painter.begin( self.trayIconPixmap.pixmap(16, 16, QtGui.QIcon.Normal, QtGui.QIcon.On) )
painter.drawText( QtCore.QRectF( QtCore.QRect(1, 1, 16, 16) ), QtCore.QString('11') )
painter.end()
self.trayIconPixmap.paint(painter, 1, 1, 16, 16)
self.trayIcon = QtGui.QSystemTrayIcon(self)
self.trayIcon.setContextMenu(self.trayIconMenu)
self.trayIcon.setIcon( self.trayIconPixmap )
при использовании begin/end получаю ошибку
StdErr: QPaintDevice: Cannot destroy paint device that is being painted.  Be sure to QPainter::end() painters!
если же не использовать begin/end то ошибки нету, но и картинка не изменяется

подскажите пожалуйста что я упустил?!
gmorgunov
Привет.
Вот так у меня(в SUSE) рисует:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Widget(QWidget):
def __init__ (self,*args):
QWidget. __init__ (self,*args)
def paintEvent(self,event=None):
painter=QPainter(self)
self.trayIconPixmap = QIcon('/home/mike/Desktop/lena.jpg') # полное имя
painter.begin( self.trayIconPixmap.pixmap(16, 16, QIcon.Normal,QIcon.On))
############################## рисуем #############################
painter.drawText( QRectF( QRect(1, 1, 16, 16) ), QString('11') )
self.trayIconPixmap.paint(painter, 16, 16, 16, 16)
self.trayIconPixmap.paint(painter, 32, 32, 16, 16)

self.trayIcon = QSystemTrayIcon(self)
#self.trayIcon.setContextMenu(self.trayIconMenu) # тут ошибка с атрибутами
self.trayIcon.setIcon( self.trayIconPixmap )
############################# закончили рисовать ############################
painter.end()
app = QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec_())
Посмотрите в assistant(doc.Trolltech.com) примерчик System Tray Icon Example.

P.S. А вообще, мне эти залипухи Тролей (paintEvent) поднадоели, поэтому смотрю PyGTK и Tkinter, чего и всем желаю. :)
Quard
Благодарю за помощь и за направление! Ваш пример у меня к сожалению рисовал только в окошке программы, а не на иконке в трее…
Во общем нашел я решение

class testTrayIcon(QtGui.QWidget):
BatteryLifePercent = 0

def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

self.quitAction = QtGui.QAction(self.tr('&Quit'), self)
QtCore.QObject.connect(self.quitAction, QtCore.SIGNAL('triggered()'), QtGui.qApp, QtCore.SLOT('quit()'))
self.timer = QtCore.QTimer(self)
QtCore.QObject.connect(self.timer, QtCore.SIGNAL('timeout()'), self.show_level)
self.timer.start(5000)

self.trayIconMenu = QtGui.QMenu(self)
self.trayIconMenu.addAction(self.quitAction)
self.trayIconPixmap = QtGui.QPixmap('icon.jpg') #файл иконки
self.trayIcon = QtGui.QSystemTrayIcon(self)
self.trayIcon.setContextMenu(self.trayIconMenu)
self.trayIcon.setIcon(QtGui.QIcon(self.trayIconPixmap))

self.trayIcon.show()
self.resize(300, 200)
self.show()

def show_level(self):
self.BatteryLifePercent += 1
pixmap = QtGui.QPixmap(self.trayIconPixmap)
painter = QtGui.QPainter(pixmap)
textOption = QtGui.QTextOption()
textOption.setAlignment(QtCore.Qt.AlignCenter)
painter.drawText(QtCore.QRectF( pixmap.rect() ), QtCore.QString(str(self.BatteryLifePercent)), textOption)
self.trayIcon.setIcon(QtGui.QIcon(pixmap))
painter.end()

def closeEvent(self, event=None):
self.trayIcon.hide()

app = QtGui.QApplication(sys.argv)
main = testTrayIcon()
sys.exit(app.exec_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB