QIcons in MenuBar unter Windows?

Alles rund um die Programmierung mit Qt
Antworten
wojtek85
Beiträge: 37
Registriert: 11. Mai 2007 19:56
Wohnort: Köln
Kontaktdaten:

QIcons in MenuBar unter Windows?

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
wojtek85
Beiträge: 37
Registriert: 11. Mai 2007 19:56
Wohnort: Köln
Kontaktdaten:

Beitrag 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?
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag 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*
Antworten