2009-10-02 32 views
9

Próbuję użyć grafiki SVG w QIcons. Mam statyczną bibliotekę, która zawiera wszystkie moje zasoby graficzne, oraz metodę w tej bibliotece statycznej, która zwraca QIcons wstępnie załadowaną poprawną grafiką. Próbuję to zrobić:Ładowanie wtyczek Qt podczas statycznego linkowania do Qt?

QIcon icon(":/icons/find.svg"); 

I sprawdzeniu, że zasoby został załadowany przez wystawianie go QDir:

qDebug() << QDir(":/icons/").entryList(); 

Jednak ikona SVG nie jest pokazywany. Po zmianie kodu ładowania ikony na:

QIcon icon(":/icons/find.png"); 

wszystko działa poprawnie.

Problem polega na tym, że wtyczka SVG nigdy się nie ładuje. mogę uzyskać listę obsługiwanych typów obrazów, które zawiera:

("bmp", "PBM", "PGM", "png", "ppm", "xbm", "xpm")

, ale bez wzmianki o SVG.

Upewniłem się, że używam modułu SVG zarówno w pliku mojej biblioteki statycznej .pro, jak i w głównym pliku .pro.

Edit:

Wydaje się, że problemem jest to, że jestem z linkami do Qt statycznie, a tym samym wszystkie wtyczki są bibliotekami statycznych. Dokumentacja dla QPluginLoader stwierdza:

Zauważ, że QPluginLoader nie może być stosowane, jeżeli aplikacja jest statycznie zlinkowana Qt. W takim przypadku musisz połączyć się statycznie z wtyczkami . Możesz użyć QLibrary, jeśli potrzebujesz do załadowania dynamicznych bibliotek w statycznie połączonej aplikacji.

Jednak statyczne łączenie z tymi wtyczkami wydaje się nic nie robić (lista obsługiwanych formatów obrazu nie rośnie).

Edit2:

Również łączenie do Qt dynamicznie (po przebudowie moją całą aplikację) sprawia, że ​​powyższy kod prac doskonale. Jednak I chce, aby łączył się statycznie ze statystyką Qt, więc pytanie wygląda teraz bardziej na temat ładowania wtyczek Qt, gdy łączę się ze statycznie, a mniej ogólnie z ikonami. Zaktualizuję tytuł postu, aby to odzwierciedlić.

Odpowiedz

1

Według documentation, sposób załadować ikonę SVG:

QSvgRenderer svgRenderer(":/icons/find.svg"); 
Q_ASSERT(svgRenderer.isValid()); 

QImage img(svgRenderer.defaultSize()); 
QPainter p(&img); 
svgRenderer.render(&p); 
p.end(); 

QIcon icon(QPixmap::fromImage(img)); 

Dla Twojego problemu łącza, QtSvg jest częścią Qt, dzięki czemu nie trzeba dodawać go jako wtyczki. Kompilacja z obsługą SVG jest wymagana:

QT += svg 
+0

dla zwykłych zastosowań, tak. Jednak ikony są różne. Dokumentacja QIcon (http://doc.trolltech.com/4.5/qicon.html) wskazuje, że za pomocą silnika svg ikon powinno być możliwe ładowanie obrazów SVG bezpośrednio do QIcons. Inni ludzie również wykonali tę pracę (http://lists.trolltech.com/qt-interest/2008-07/thread00105-0.html) nie w statycznym kontekście. – Thomi

+0

Przepraszam, właśnie zdałem sobie sprawę, że powyższy komentarz jest niejednoznaczny. "aplikacje" w pierwszym zdaniu mają znaczenie "w użyciu", a nie w "programach użytkowych". – Thomi

Powiązane problemy