Hintergrund eines Icon von QTreeWidgetItem dynamisch ändern

Alles rund um die Programmierung mit Qt
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Hintergrund eines Icon von QTreeWidgetItem dynamisch ändern

Beitrag von miguel_m »

Hallo,
ich hab folgendes Problem. Ich möchte in einem QTreeWidgetItem, dessen Icon nutzen um einen Status zu veranschaulichen, das heißt die Hintergrundfarbe soll nun je nach Status geändert werden.

Ich hab schon versucht das Bild per Pixmap zu laden, dessen Hintergrund zu ändern und da ganze dann dem Icon zuzuweisen, leider kommt dabei eine teils Schwarze Fläche bei raus mit einigen Pixelfehlern.

Hat da jemand eine Idee zu?

Hier mal mein bisheriger Stand:

Code: Alles auswählen

cl_treeWidgetItemIcon::cl_treeWidgetItemIcon(const QString &deviceType, const QString &Status)
{
    QPixmap myPixmap(80,80);
    QPixmap mySecondPixmap("Pictures/Bild1.svg");
    //QImage  myImage("Pictures/Bild1.svg");
    //myImage.setColor();
    // myPixmap.load("Pictures/CLS.svg");
    //myPixmap.fill(QColor(Qt::green));

    QPainter myPainter(&myPixmap);
    myPainter.setBackground(QBrush(Qt::green));
    myPainter.drawPixmap(40,0,40,40,mySecondPixmap);

    m_icon =new QIcon(myPixmap);
}

QIcon * cl_treeWidgetItemIcon::Icon()
{
    return m_icon;
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von franzf »

.svg == scalable vector graphics, das ist absolut kein Pixmap!
Deshalb bekommst du das auch nicht mit nem Pixmap in den painter, sondern per QSvgRenderer.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von Christian81 »

QPainter::setBackground() macht nicht das was Du denkst. Du suchst QPainter::fill()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

Ja, fill hatte ich auch schon versucht, ich denke das Problem liegt wohl wirklich an dem svg.

Hierzu mal ne Frage, auch wenn ich mich grad glaub ich ein wenig doof anstelle, wie bekomme ich denn das QSvgRenderer in den Painter? Ich dachte erst über nen QSvgGraphicsItem, aber das ist ja eher für nen graphicsview gedacht oder?
Irgendwie, fehlt mir grad noch die Idee wie ich das ganze am Ende in nen QIcon packe, in ne Graphicview wär ja kein Ding ....
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von franzf »

QSvgRenderer hat nen SLOT render(). Den kannst du natürlich auch einfach im Code (also ohne SIGNAL-SLOT-Connection) aufrufen.
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

Also seltsamerweise funktioniert das ganze mit folgendem Code, kann es sein das QPixmap das rendern intern übernimmt?

Wie auch immer das Problem lag daran das meine erste Pismap keinen inhalt hatte und somit nur Pixelmüll gezeigt wurde.
das einzige Problem das ich jetzt noch habe ist das das QImage myIconPic, nicht scaliert wird, ich würde es gern so scalieren das es bestmöglich in mein 50*50px pixmap passt, aber durch den skalierbefehl, ändert sich leider gar nichts...

Code: Alles auswählen

cl_treeWidgetItemIcon::cl_treeWidgetItemIcon(const QString &deviceType, const QString &Status)
{
    QImage *myIconPic = new QImage(QString("Pictures/CLS.svg"));
    myIconPic->size().scale(40,50,Qt::KeepAspectRatio);

    QPixmap *myPixmap = new QPixmap(50,50);
    myPixmap->fill();
    QPainter *myPainter = new QPainter(myPixmap);
    myPainter->fillRect(0,0,10,10,QBrush(Qt::green));
    myPainter->drawImage(15,0,*myIconPic);


    m_icon =new QIcon(*myPixmap);
}

QIcon * cl_treeWidgetItemIcon::Icon()
{
    return m_icon;
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von franzf »

Schau mal GENAU was QImage::size() zurück liefert, und überleg dir, ob das scale darauf einen Einfluss hat.
Desweiteren kann QImageReader auch SVGs lesen (gerade nachgeschaut), demnach geht auch das Laden von SVGs in QPixmap. Dafür wird aber das QtSvg-Modul benötigt.
Kann es sein, dass du immer noch QT += svg in deinem .pro stehen hast? Geht es nicht mehr, wenn du das wieder raus nimmst?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von Christian81 »

Allerdings sind in der Funktion cl_treeWidgetItemIcon() auch noch 3 Memleaks und keins davon wäre nötig da man die Objekte einfach auf dem Stack anlegen könnte.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

@franzf: da hast du wohl recht, wer lesen kann ist da klar im Vorteil. size() gibt natürlich den werd zurück, ist aber nicht dafür da geändert zu werden. Ich hab jetzt mit der scaled() funktion das Bild skaliert, funktiert auch brav, so wie es soll. Das +=svg kann ich leider nich so einfach rausnehmen, da ich das modul für einen anderen teil in der Software auch nutze.
@Christian81: Danke für den hinweis, hab ich geändert.

Vielen Dank für eure schnelle Hilfe.
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

Leider sthe ich gerade vor dem nächsten Problem in diesem Zusammenhang ... die Debug version läuft so wie ich es wünsche. Sobald ich aber eine Release version erstelle und diese dann starten möchte, scheint es so als würde er das svg nicht mehr in die Pixmap schreiben. An der Pfad zuweisung dürfte es nicht liegen, da andere Bilderer im Programm mit der gleichen Pfad Hierarchie trotzdem funktionieren.
Hat jemand eine Idee woran das liegen könnte?
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

Inzwischen ist mir aufgefallen das auch die Debug version das pixmap falsch anzeigt, ein fill() wird ausgeführt, das überschreiben mit einer .svg datei geht dann nur noch wenn man das Program aus qt creator startet.

Ich bin grad echt ratlos, hat vielleicht jemand eine Idee?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von Christian81 »

Du gibst einen relativen Pfad an und der wird dann wohl nicht passen...
Siehe QCoreApplication::applicationPath() und co
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

Das wäre schön wenn es das Problem wäre, aber seltsamer weise zeigt das Programm alle anderen Icons an, nur eben nicht die Icons im tree. Und die svgs liegen im gleichen Ordner wie die anderen. Ich hab ein wenig die vermutung es könnte wieder ein Library Problem sein. Macht Qt Creator denn irgendwas anders beim starten der Applikation oder ist es prinzipiell das gleiche wie bei nem Doppelcklick auf die .exe im Debug verzeichnis?


Hier mal der Code:

Code: Alles auswählen

 QIcon * cl_treeWidgetItemIcon::Icon(const QString &Status)
{
    //QImage myIconPic(QImage(getPath(m_type)));

    QPixmap myPixmap(QPixmap(64,64));
    // myPixmap.fill(QColor(QString("#0000FF")));
    myPixmap.load(QString("Pictures/IconBackGround.svg"));


    //QPainter myPainter(&myPixmap);
    //myPainter.fillRect(0,0,10,10,QBrush(QColor(gl_getStatusColor(Status))));
    //myPainter.drawImage(15,0,myIconPic.scaled(QSize(40,40),Qt::KeepAspectRatio));

    m_icon = new QIcon(myPixmap);

    return m_icon;
}
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

Mal zur verdeutlichung nen screenshot wie sich der fehler äußert:
Dateianhänge
Screenshot
Screenshot
treeError.jpg (10.5 KiB) 6216 mal betrachtet
miguel_m
Beiträge: 15
Registriert: 13. Januar 2012 14:37

Re: Hintergrund eines Icon von QTreeWidgetItem dynamisch änd

Beitrag von miguel_m »

Ich hab jetzt mal weiter nach geforscht, das Pixmap wird mit dem Pfad QCoreApplication::applicationDirPath.append("\Pictures\bild.svg") gefüttert. Ich gebe den Pfad und den Rückgabewert von dem load befehl in einer Datei aus. Beim Starten aus Qt Creator wird der gleiche Pfad ausgegeben wie beim starten außerhalb von qt Creator, der rückgabewert ist jedoch beim starten außerhalb von qt creator '0'.

Ich kapier das grad nicht. Der Pfad ist der gleiche, es ist die gleiche exe und er lädt das bild trotzdem nicht ... hat noch irgendjemand eine Idee? ich verzweifel so langsam, aber sicher.
Antworten