Seite 1 von 1

[gelöst] QImage und QCanvasText in eine Pixmap?

Verfasst: 3. Februar 2006 15:07
von MOAS
hallo leute,
erstmal ein hallo an alle :-)

ich versuche gerade die ganze zeit auf einem QCanvas eine art icon zuerstellen, welches aus einem bild (QImage) und einem darunter stehenden text (QCanvasText) besteht. etwa so wie im windows-explorer die symbole in der symbolansicht.
mein problem ist jetzt, das ich keinen ansatz habe, wie man diese beiden objekte zusammenführt, so dass sie hinterher als ein item auf dem canvas behandelt werden können. beides in ein QPixmap? aber wie?

vielleicht sollte ich noch dazu sagen, dass ich mit python arbeite, was an der grundlegenden realisierung ja aber nichts ändert. auch c++ code verstehe ich. bin für jede hilfe dankbar. falls quellcode erwünscht ist, poste ich den gerne noch.

danke
mfg

moas

Verfasst: 6. Februar 2006 08:48
von stippy
Hi moas,

ich denke das wird Dir weiter helfen:

http://www.digitalfanatics.org/projects ... ter12.html

Gruss, Dirk

Verfasst: 6. Februar 2006 10:21
von MOAS
danke dirk,

ich werd's mir gleich anschauen. ich geb dann nochmal bescheid, wenn's funktioniert.

mfg Heiko

Verfasst: 6. Februar 2006 11:59
von MOAS
Also der Text ist nun schon erstmal Teil des Items.
Das Problem ist nun jedoch, zu wissen, wie groß (Höhe, Breite) der Text ist, um dementsprechend die Zeichenfläche richtig zu erstellen. Wie bekomme ich das hin?


Momentan habe ich einfach die Zeichenfläche mit setSize() um 20 Pixel höher gemacht, als das Icon. Das funktioniert auch ganz gut. Die Länge ist jedoch variabel und außerdem will ich den Text später unterhalb des Icons zentrieren.
Ich könnte natürlich für jedes Zeichen die Zeichenfläche um einen festen Wert erweitern. Die Zeichen auf der Zeichenfläche sind ja aber unterschiedlich breit...

Mein Quellcode sieht zur Zeit folgendermaßen aus:

Code: Alles auswählen

class IconItem(QCanvasRectangle):
    def __init__(self,ico, ico_text, canvas):
        QCanvasRectangle.__init__(self,canvas)

        self.imageRTTI=984376
        self.image = ico

        self.iconItem_text = ico_text
        
        self.setSize(self.image.width(), self.image.height()+20)
        self.pixmap=QPixmap()
        self.pixmap.convertFromImage(self.image, Qt.OrderedAlphaDither);

    def rtti(self):
        return self.imageRTTI

    def hit(self,p):
        ix = p.x()-self.x()
        iy = p.y()-self.y()
        if not self.image.valid( ix , iy ):
            return False
        self.pixel = self.image.pixel( ix, iy )
        return  (qAlpha( self.pixel ) != 0)

    def drawShape(self,p):
        p.drawPixmap( self.x(), self.y(), self.pixmap )
        p.drawText(self.x(), self.y()+self.image.height()+20, self.iconItem_text)

Verfasst: 6. Februar 2006 13:12
von MOAS
Hab die Lösung:

Code: Alles auswählen

class IconItem(QCanvasRectangle):
    def __init__(self,ico, ico_text, canvas):
        QCanvasRectangle.__init__(self,canvas)

        self.imageRTTI=984376
        self.image = ico

        self.ico_txt_w = QCanvasText(ico_text, canvas).boundingRect().width()
        self.ico_txt_h = QCanvasText(ico_text, canvas).boundingRect().height()
        self.ico_txt = ico_text
        
        self.setSize(self.image.width(), self.image.height()+20)
        if self.ico_txt_w > self.image.width():
            self.setSize(self.ico_txt_w, self.image.height()+20)
        self.pixmap=QPixmap()
        self.pixmap.convertFromImage(self.image, Qt.OrderedAlphaDither);
        self.ico_txt = str(self.ico_txt_w)

    def rtti(self):
        return self.imageRTTI

    def hit(self,p):
        ix = p.x()-self.x()
        iy = p.y()-self.y()
        if not self.image.valid( ix , iy ):
            return False
        self.pixel = self.image.pixel( ix, iy )
        return  (qAlpha( self.pixel ) != 0)

    def drawShape(self,p):
        p.drawPixmap( self.x(), self.y(), self.pixmap )
        p.drawText(self.x(), self.y()+self.image.height()+20, self.ico_txt)
Danke schön für die schnelle Hilfe! :-) Problem gelöst!

MfG Heiko