Wie lade ich automatisiert SVG-Icons?

Alles rund um die Programmierung mit Qt
Antworten
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Wie lade ich automatisiert SVG-Icons?

Beitrag von Eltharion »

Hi.

Ich möchte ein QIconEnginePlugin schreiben, welches es mir erlaubt, beim Anlegen der Actions jeweils ein QIcon("xy.svg") im SVG Format zu laden und zu benutzen. Dazu habe ich QIconEnginePlugin und QIconEngine abgeleitet und implementiert. Konkret warte ich auf den Aufruf von QIconEngine.pixmap() und erzeuge mittels QPicture.load() ein Bild, welches in eine Pixmap umgewandelt wird. Dabei benötige ich Eure Hilfe, denn das Icon erscheint nicht. Nur ein schwarzer Fleck mit manchmal zufälligen Punkten. Die Plugin-Routinen funktionieren soweit, sprich es wird gefunden und aufgerufen.

Code: Alles auswählen

void SvgIconEngine::paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state)
{
  QString filename = ":/images/action_connect.svg";

  QPicture picture = new QPicture();
  picture->setBoundingRect(rect);
  picture->load(filename, "svg");

  painter->drawPicture(0, 0, *picture);

  painter->end();

  if (picture)
    delete picture;
}
Ich habe erstmal ein festes SVG eingebaut. Mache ich irgendwas falsch? Die SVG lib ist eingelinkt.

Ein zweites Problem stellt sich mir, da ich nicht weiss, woher die QIconEngine eigentlich Ihre Daten bekommt. Ich kann bei addFile einen Dateinamen angeben und mir merken, aber wenn ich automatisch Icons laden lasse, wird addFile() nicht explizit aufgerufen. Woher bekommt QIconEngine die Daten bzw. den Hinweis, welche Datei benutzt werden soll? Das ist irgendwie nirgends dokumentiert. Ich habe schon in qicon.cpp gestochert, aber nichts richtiges gefunden.

Ich würde mich riesig freuen, wenn mir jemand wieterhelfen kann. Auch Hinweise auf andere Sourcen, die das Problem schon gelöst haben wäre hilfreich. Danke schonmal.

E*
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag von Eltharion »

So. Nachdem ich mir den QFactoryLoader und QIconEngineFactoryInterface genauer angeschaut habe (wollte ich eigentlich gar nicht), glaube ich, habe ich einen Weg gefunden. Quelltext kommt später, sofern Bedarf besteht. Erstmal sauber implementieren.

E*
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag von Eltharion »

Hab's ja versprochen, hier ist das Plugin. Einfach qmake && make und dann an die richtige Stelle kopieren und man kann mittels QIcon("xy.svg") SVG Icons benutzen.

Meine Probleme kamen daher, dass Qt nur eine ganz kleine Untermenge von SVG unterstützt. Ich hatte Version 4.1.0 drauf und hab' diese Version sogar bis zum Crash wegen SVG-Icons bringen können. Und auch ansonsten wollten Icons per Hand nachbearbeitet werden. Sie waren ansonsten nur in Graustufen/Fehlfarben zu benutzen. Und ich hab' mit QPicture, aber auch mit dem SVG-Renderer-Klassen experimentiert bis zum Umfallen :-(

Seit Qt 4.1.3 (ist jetzt raus) ist es möglich, die SVG-Icons ohne manuelle Nachbearbeitung zu laden. Da hat sich einiges verbessert. Auch die Crashs sind jetzt raus.

Das Plugin funktioniert soweit und wird in meiner Anwendung benutzt werden. Schreibt mir einfach Eure Anmerkungen dazu. Ich freue mich, wenn's wer gebrauchen kann.

E*


Edit 19.06.2006: Habe das Attachment entfernt und stattdessen eine offizielle Download-Möglichkeit eingerichtet:

http://www.mudmania.de/downloads/

Ansonsten gehen mittlerweile auch transparente SVG-Icons, so dass bspw. in einer Toolbar keine Ränder mehr an den Icons zu sehen sind. Der Cache fehlt leider immer noch. Zeitmangel.
Antworten