Seite 1 von 1
QIcons in MenuBar unter Windows?
Verfasst: 18. Mai 2007 11:38
von wojtek85
Hallo,
ich möchte in meiner Menüleiste zu den diversien Optionen kleine Icons anzeigen lassen. Unter Linux bekomme ich das zum Laufen mit
Code: Alles auswählen
newAction = new QAction(QIcon("/images/new_button.png"),tr("&New"), this);
aber unter Windows hab ich schon alles probiert, natürlich auch mit .ico Bilddateien aber irgendwie funzt nichts. Ich hoffe mir kann einer helfen.
Danke. W
Verfasst: 18. Mai 2007 12:12
von upsala
Auch schon mal das .png unter C:\icon.png abgelegt und diesen absoluten Pfad angegeben.
Ansonsten würde ich mich mal mit der Resourcen-Verwaltung von Qt4 beschäftigen. Damit würdest du auch Plattformunabhängiger.
Verfasst: 18. Mai 2007 12:31
von wojtek85
Jo, das hat auf Anhieb geklappt, aber es muss doch irgendeine Möglichkeit geben, dass er es ohne den absoluten Pfad liest. Das wär ja bei jedem Verschieben, umbennen o.ä. jedes mal ein Stress.Unter Linux läuft es ja auch. Gibts da nicht was Windows-spezifisch, was da anders sein könnte?
Verfasst: 18. Mai 2007 15:47
von Eltharion
Also wenn Du einen absoluten Pfad angibst, wird er auch immer in diesem Pfad danach suchen
Du kannst auch ganz einfach z.B. Dein QApplication-Objekt erweitern, so dass dieses flexibel reagieren kann. Also z.B. packst Du Routinen dazu, um Standard-Verzeichnisse zu ermitteln und zu Dateien den absoluten Pfad zu bestimmen (indem in jedes Standard-Verzeichnis mal eben geschaut wird, ob die Datei drin liegt):
PS: lässt sich sicher noch optimieren, bitte keine diesbezügliche Kritik
Code: Alles auswählen
QString Application::locateFile(const QString &filename, FileType type /*=Unknown*/)
QString path;
switch (type) {
case Icon:
{
QDir dir;
dir.cd(standardDirectory(User));
if (dir.exists("resources/icons")) {
dir.cd("resources/icons");
if (QFile::exists(dir.canonicalPath() + "/" + filename))
return dir.canonicalPath() + "/" + filename;
}
dir.cd(standardDirectory(Common));
if (dir.exists("resources/icons")) {
dir.cd("resources/icons");
if (QFile::exists(dir.canonicalPath() + "/" + filename))
return dir.canonicalPath() + "/" + filename;
}
dir.cd(standardDirectory(Program));
if (dir.exists("resources/icons")) {
dir.cd("resources/icons");
if (QFile::exists(dir.canonicalPath() + "/" + filename))
return dir.canonicalPath() + "/" + filename;
}
qWarning() << "Icon not found! Checked in user/common/app resources dir.";
return QString();
}
break;
....
return path;
}
Damit kannst Du dann Plugins, Ressourcen, Dateien des Hilfe-Systems, ... suchen lassen ohne dass es Dich interessiert, wo die Dateien überhaupt stehen. Du benutzt dann nur noch z.B.
Code: Alles auswählen
QString MainWindow::iconPath(const QString &iconName)
{
Application *a = dynamic_cast<Application *>(qApp);
return a->locateFile(iconName, Application::Icon);
}
...
Code: Alles auswählen
m_action_file_new = new QAction(QIcon(iconPath("new.svg")), _("&New"), this);
um die Actions anzulegen und das eigentliche Suchen der Dateien erfolgt ganz von selbst. Das hat dann auch gleich (wenn Du's geschickt programmierst) den Vorteil, dass Deine Apps z.B. auch ohne Installation direkt vom Memory-Stick laufen können.
E*