Pfad von externer Anwendung herausfinden

Alles rund um die Programmierung mit Qt
barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Pfad von externer Anwendung herausfinden

Beitrag von barahir1983 »

Liebe Community,

ich habe folgende Problemstellung: in meinem Programm werden LaTeX und Lilypond als externe Anwendungen aufgerufen. Um diese korrekt mit QProcess aufrufen zu können, benötige ich den direkten Pfad zu den ausführbaren Dateien, sollte ich hier nicht falsch liegen. Da das Programm sowohl auf Linux als auch auf MacOs und Windows laufen soll, suche ich nun nach einer (betriebssystemübergreifenden) Lösung, die Pfade zu den jeweiligen Executables herauszufinden. Daher fällt leider schon mal das Unix-Tool find flach; gibt es eine Qt-immanente Funktion, die nach bestimmten Dateien suchen kann (am Besten in allen Ordnern, die vom Programm aus zugänglich sind, denn ich kann ja schlecht für jeden Benutzer raten, wo auf seinem Computer er LaTeX bzw. LilyPond installiert hat)?

Wer hat Ideen? Vielen Dank für alle Hilfe im Voraus!
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Hallo erstmal,
also ganz so schwer ist es meiner Meinung nach nicht. Von Mac hab ich keine Ahnung, aber bei Linux brauchst du den Pfad zur Executable normalerweise nicht, da der Pfad mit in PATH drin steht und du ganz einfach "pdflatex" aufrufen kannst, wie du es auch im Terminal machen würdest. Unter Windows nimmst du dir einfach QSettings, um in der Registry den entsprechenden Installationspfad auszulesen.

Mfg androphinx
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

99% der Leute, die aehnliches Problem haben, lassen den user die Pfade zu den binaries selber angeben ... mit vielleicht bissi hilfestellung und/oder sehr naiver Voreinstellung.

Dein Problem im Detail:
Unter Windows gibts nen nur sehr groben Anhaltspunkt wo man Applicationen ablegt. Ein recht grosser Teil missachtet das scho aus Prinzip / bzw aus technischer notwendigkeit.
(Nur weil Windows 7 z.b. meint, ich muesst Apps unter %WINDIR%\Program Files\ ablegen und ich auch nen Office brauch, werd ich mir sicher nich statt ner 64 GB SSD ne 128er holen zum über den doppelten Preis holen wollen ).

Unter Linux gibts paar strictere richtlinien, da koenntest du eher gezielt suchen (/usr/bin /opt .... ). Das SSD Problem hasst da ned, weil Partitionen ueber mountpoints verwalten koenntest (Geht unter neueren windows auch, macht nur keiner) ...

Nen Globales suchen dauert aber .... und ich wuerd nen prog, was zuerst meine Verzeichnisse alle scant wahrscheinlich eh erst mal unter quarantaene stellen, wenn ichs mitbekomm ...

Mein tipp ...
Lass es den user einstellen !
Unterstuetz ihn, in dem nur und ausschliesslich an "wahrscheinlichen" stellen suchst (C:\windows\Porgram Files\ApppName\..... /usr/bin .... )
Das bekommst mit QT und QDesktopServices QDesktopServices::ApplicationsLocation in 1. annaeherung schon hin ...
Willst mehr, wirst schon auf BS Besonderheiten eingehen muessen (Compilerswitches verwenden, dann wirds nach aussen wieder quasi BS neutral)
Aber immer davon ausgehen das es nicht ermitteln kannst und der User eigentlich eingeben sollte ... die Funktion nur ne unterstuetzung ist !

Ciao ...
barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Beitrag von barahir1983 »

Vielen Dank erstmal für die Anregungen, ich fürchte auch sehr, dass sich da eine betriebssystemabhängige Suchvariante für die Unices und Windows nicht ganz vermeiden lässt; zugegebenermaßen ist ein Programm, das den ganzen Computer nach einer einzigen Datei absucht auch ein wenig hirnrissig :)

@androphinx: leider reicht es nicht, nur die executable anzugeben, das macht QProcess nicht wirklich mit;

@RHBaum: werde mir mal QDesktopServices genauer ansehen, das dürfte in die Richtung gehen. Irgendwie müssen es die Macher von kile (KDE Integrated LaTeX Environment) auch gemacht haben, aber die müssen sich ja quasi nur um Linux kümmern :)

Danke für die Anregungen, werde mal kommentieren, was letztendlich meine Lösung geworden ist.

Liebe Grüße
Barahir
QtCreator 2.5 beta und Qt Libraries 4.8.0 auf MacOS X 10.7.3
Herzogswalder
Beiträge: 79
Registriert: 11. Oktober 2009 00:37
Wohnort: Dresden

Beitrag von Herzogswalder »

@RHBaum: Nicht "%WINDIR%\Program Files", sondern "%SYSTEMDRIVE%\Program Files".
Unter Linux ist es doch auch so: Standardmäßig werden Anwendungen unter "/usr" installiert.
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Beitrag von barahir1983 »

So, habe mir mal ein wenig den Kopf zerbrochen und nun diese Lösung entworfen, die wenigstens unter Windows und Linux das tut, was sie soll :roll: - MacOSX scheint alle Programme erstmal ohne Pfad auszuführen, jedenfalls um den Programmpfad für die Shell. :roll:

Code: Alles auswählen

    QString paths = std::getenv("PATH");
#ifdef Q_WS_WIN
    QStringList pathlist = paths.split(QRegExp(";"));
#endif
#ifdef Q_WS_X11
    QStringList pathlist = paths.split(QRegExp(":"));
#endif
#ifdef Q_WS_MAC
 QStringList pathlist = paths.split(QRegExp(":"));
#endif

    foreach(QString str,pathlist)
    {
       if (str.contains(QRegExp("LilyPond")))
       {
           if (ui->lilypondE->text() == "") ui->lilypondE->setText(str);
       }
       if (str.contains(QRegExp("tex")))
       {
           if (ui->latexE->text() == "") ui->latexE->setText(str);
       }
#ifdef Q_WS_WIN
        if (str.contains(QRegExp("Gregorio")))
        {
           if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
        }
#endif
#ifdef Q_WS_X11
       if (str.contains(QRegExp("usr/local/bin")))
       {
          if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
       }
#endif
#ifdef Q_WS_MAC
       if (str.contains(QRegExp("usr/local/bin")))
       {
          if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
       }
#endif


Jetzt besteht mein Problem eigentlich nur noch darin, wie MacOS Pfade vergibt. Was haltet ihr von dieser Lösung?
QtCreator 2.5 beta und Qt Libraries 4.8.0 auf MacOS X 10.7.3
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Vom gedanken her ist es sicher nicht schlecht, aber warum so kompliziert und warum verwendest du immer QRegExp?

Code: Alles auswählen

#ifdef Q_WS_WIN
    QString my_sep(";");
#endif
#ifdef Q_WS_X11
    QString my_sep(":");
#endif
#ifdef Q_WS_MAC
    QString my_sep(":");
#endif

QString path(qgetenv("PATH"));
QStringList lst = path.split(my_sep);

QStringList::const_iterator it;

for (it= lst.constBegin(); it!= lst.constEnd();++it)
{
    //entweder jetzt mit indexOf(...)
    //oder mit endsWith(...)
    //oder mit contains(...) abfragen ob der string vorhanden ist
}


barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Beitrag von barahir1983 »

Vielen Dank auch für diesen Tipp, ich gucks mir mal an.
EDIT: Habs mal so implementiert und es funktioniert (unter MacOS) auch - jedenfalls wenn man das Programm von der bash aus startet.

Code: Alles auswählen


#ifdef Q_WS_WIN
    QString my_sep(";");
#endif
#ifdef Q_WS_X11
    QString my_sep(":");
#endif
#ifdef Q_WS_MAC
    QString my_sep(":");
#endif

QString path(qgetenv("PATH"));
QStringList lst = path.split(my_sep);
QString str;
QStringList::const_iterator it;

for (it= lst.constBegin(); it!= lst.constEnd();++it)
{
    str = *it;
    if (str.contains("LilyPond"))
    {
        if (ui->lilypondE->text() == "") ui->lilypondE->setText(str);
    }
    if (str.contains("tex"))
    {
        if (ui->latexE->text() == "") ui->latexE->setText(str);
    }
#ifdef Q_WS_WIN
     if (str.contains("Gregorio"))
     {
        if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
     }
#endif
#ifdef Q_WS_X11
    if (str.contains("usr/local/bin"))
    {
       if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
    }
#endif
#ifdef Q_WS_MAC
    if (str.contains("usr/local/bin"))
    {
       if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
    }
#endif
}
QtCreator 2.5 beta und Qt Libraries 4.8.0 auf MacOS X 10.7.3
barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Beitrag von barahir1983 »

Hat noch jemand vielleicht einen Tipp für mich, wie man am Mac auf die Systempfadvariable zugreifen kann, wenn das Programm "ganz normal" aus dem Programme-Ordner gestartet wird? Danke!
QtCreator 2.5 beta und Qt Libraries 4.8.0 auf MacOS X 10.7.3
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

@RHBaum: Nicht "%WINDIR%\Program Files", sondern "%SYSTEMDRIVE%\Program Files".
ups, ja, Asche auf mein Haupt ... aber eigentlich sollt es auch %PROGRAMFILES% oder sowas geben ....
Unter Linux ist es doch auch so: Standardmäßig werden Anwendungen unter "/usr" installiert.
jein
der Standard ist nicht "zwingend", und sagt :
/usr/bin Programme mit Userrechten, die nicht zum start benoetigt werden

Die meisten Linux systeme interpretieren "Programme" aber als systemeigene / Distributionsspezifische Programme.

Weiterhin gibts den "Vorschlag" das Progs die an der Distributionseigenen Verwaltung vorbei istalliert werden, unter /usr/local/bin liegen sollten
Weiterhin gibts Systeme, die meinen "optionale" Programme kommen unter /opt

Dieses ganzes Ablagesystem bezieht sich nur auf die "Startverzeichnisse" nicht auf die Ablage , d.h. die software kann irgendwo liegen, und im bin verzeichniss liegt nur nen link
(Sollte aber QProcess keine Probleme mit haben ... )
Probleme hat man dann, wenn Linux Programme von Freaks gemacht werden, die keine Ahnung von Linux haben, und wo die progs unbeding aus nem bestimmten verzeichniss heraus gestartet werden sollen ... wo noch zig andere libs und dateien zwingend liegen muessen ^^

@barahir1983
Du machst dir das viel zu kompliziert!

die binary Namen kennst doch.

Such die einfach ueber DesktopService den Programm Pfad raus.
haeng den binary namen drann, und check ob die datei existiert.
Wenn ja, biet ihm das an
Wenn nein, biet ihm nur den binary namen an ....
Das ganze machst einmal initial, wenn in deiner config die werte noch ned gesetzt wurden, nach dem 1 mal schreibst die Werte rein ...
Der user kann die immer anpassen, damit isses sein Problem ...
Wichtig ist nur, wenn die pfade da ned stimmen, dass ihm ansprechende Fehler praesentierst !

Schau dir an wie es Linux programme ala k3b (nutzt zig konsolenprogs) irgendwelche video-konvertierer (nutzen consolenprogramme zum konvertieren) machen ....
Warum den Schuh noch mal neu erfinden ? und Linux User sind das definitiv gewoehnt ...
Windows User sollten sich aber auch schnell mit zurecht finden ....
fuer windows user kannst aber immernoch die funktionalitaet aufbohren und den windows installer durchforsten um rauszubekommen ob nen progg installiert wurde und wo ....

Wenn da zu viel funktionen reinhaengst, kann genau das gegenteil passieren, nämlich das auch nutzerkreise ausschliessen kannst.
Was ist wenn einer mehrere versionen von einem von dir benoetigten prog auf der platte hat ?

Ciao ....
Zuletzt geändert von RHBaum am 5. November 2010 13:47, insgesamt 2-mal geändert.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Ich mag keine Iteratoren ;-P

Code: Alles auswählen

#ifdef Q_WS_WIN
    QString my_sep(";");
#endif
#ifdef Q_WS_X11 | Q_WS_MAC
    QString my_sep(":");
#endif

QString path(qgetenv("PATH"));
QStringList lst = path.split(my_sep);

foreach (const QString str, lst) {
{
        // usw

#ifdef Q_WS_WIN
     if (str.contains("Gregorio"))
     {
        if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
     }
#endif
#ifdef Q_WS_X11 | Q_WS_MAC
    if (str.contains("usr/local/bin"))
    {
       if (ui->gregorioE->text() == "") ui->gregorioE->setText(str);
    }
#endif
}
Das mit der Suche nach tex ist denk ich zu generisch ... bei mir wäre das aktuell zB "/vol/vortex/usw". Du könntest das mit QDir/QFile::exist verfeinern ... und so kommt man aus lauter Userfriendlyness vom 100sten ins 1000ste :) -

Alternativ guckst du obs unter mac sowas wie das "which" unter linux gibt und nutzt jeweils die per QProcess :) dann kannste gezielter suchen
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Beitrag von barahir1983 »

Hallo und nochmals danke an alle; ich sehe schon die Probleme einer zu starren Suche :)
Wenn ich das jetzt über die QDesktopService Methode lösen wollte, wie bekomm ich denn da exakt den Pfad zu TeX? Das befindet sich nicht unbedingt in Standardordnern für Programme.
Ich hatte mal versucht zu lunzen wie kile das löst, da müsst ich aber gleich den ganzen Code komplett durchforsten (massig Arbeit).

Mir ist die Methode über which / kpsewhich recht sympathisch, gibt es denn zu which annähernd ein äquivalent in Windows?

Danke, barahir
QtCreator 2.5 beta und Qt Libraries 4.8.0 auf MacOS X 10.7.3
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Mir ist die Methode über which / kpsewhich recht sympathisch, gibt es denn zu which annähernd ein äquivalent in Windows?
gibt sicher fuer shell-nachbauten etwas ...
fuer windows gibts die Suche (indiziert), wo mit der winapi aber auch draufkommen solltest.

generell machen naive suchprogramme nix anderes, als sich nen einstiegspunkt ins filesystem zu suchen, und dann rekursiv da durchzufahren.

Programmiertechnisch kannst du genau das selbe tun. Dieser Aufwand der rekursiven Suche steht in keinem Verhaeltniss zu "Sicherheits-Assynchronitat-Streamauswertung Problemen", die bei einer externen suche (generell aufrufen eines externen Progs) auftreten wuerden ... von daher, mach es selbst !
Schau dir QDir und QFIleInfo an, dann wusel mal los ...

Ciao ...
barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Beitrag von barahir1983 »

Na da wusel ich mal :) melde mich hier wieder, wenn ich zu nem Ergebnis gekommen bin. LG barahir
QtCreator 2.5 beta und Qt Libraries 4.8.0 auf MacOS X 10.7.3
barahir1983
Beiträge: 21
Registriert: 30. August 2010 14:51
Wohnort: Jena
Kontaktdaten:

Beitrag von barahir1983 »

Soo... gewerkelt und funktioniert soweit ganz gut; gibt es eigentlich ne Möglichkeit bei ifdef gleich doppelt auszuwählen? Da würd ich mir glatt einen gleichlautenden Block für die Un*ces sparen. Gibt's hier noch eventuelle Probleme, die man beachten müsste? Und: kann man dem QDirIterator möglicherweise mehrere Pfade zur Auswahl geben?

Sorry für den großen Codeblock, das wird leider immer länger (auch dank eurer Hilfe!) :-D

LG Barahir

Code: Alles auswählen

void NaProg::initialization()
{
    QMessageBox::information(this,tr("Notatio Antiqua"),
                          tr("Es werden die ausführbaren Dateien für LaTeX, Lilypond und Gregorio gesucht. Das kann eine Weile dauern, bitte haben Sie Geduld."),QMessageBox::Ok,QMessageBox::NoButton);
    LaTeX_Path = ""; // Initialisierung der Variablen
    Lilypond_Path = "";
    Gregorio_Path = "";
    // QDesktopServices::storageLocation(QDesktopServices::ApplicationsLocation zeigt bei MacOS auf /Applications, was hier nicht unbedingt hilfreich ist.
#ifdef Q_WS_X11
    QDirIterator where_are_you("/usr",QDir::Files,QDirIterator::Subdirectories);
    while (where_are_you.hasNext())
    {
        where_are_you.next();
        if (where_are_you.fileInfo().fileName() == "lualatex")
        {
            if (LaTeX_Path.isEmpty())
                LaTeX_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für LaTeX gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(LaTeX_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) LaTeX_Path = where_are_you.fileInfo().canonicalPath();
        }
        if (where_are_you.fileInfo().fileName() == "lilypond-book")
        {
            if (Lilypond_Path.isEmpty())
                Lilypond_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für Lilypond gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(Lilypond_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) Lilypond_Path = where_are_you.fileInfo().canonicalPath();
        }

        if (where_are_you.fileInfo().fileName() == "gregorio")
        {
            if (Gregorio_Path.isEmpty())
                Gregorio_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für Gregorio gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(Gregorio_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) Gregorio_Path = where_are_you.fileInfo().canonicalPath();
        }


    }
#endif
#ifdef Q_WS_MAC
    QDirIterator where_are_you("/usr",QDir::Files,QDirIterator::Subdirectories);
    while (where_are_you.hasNext())
    {
        where_are_you.next();
        if (where_are_you.fileInfo().fileName() == "lualatex")
        {
            if (LaTeX_Path.isEmpty())
                LaTeX_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für LaTeX gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(LaTeX_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) LaTeX_Path = where_are_you.fileInfo().canonicalPath();
        }
        if (where_are_you.fileInfo().fileName() == "lilypond-book")
        {
            if (Lilypond_Path.isEmpty())
                Lilypond_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für Lilypond gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(Lilypond_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) Lilypond_Path = where_are_you.fileInfo().canonicalPath();
        }

        if (where_are_you.fileInfo().fileName() == "gregorio")
        {
            if (Gregorio_Path.isEmpty())
                Gregorio_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für Gregorio gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(Gregorio_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) Gregorio_Path = where_are_you.fileInfo().canonicalPath();
        }


    }
#endif
#ifdef Q_WS_WIN
    QDirIterator where_are_you(QDesktopServices::ApplicationsLocation,QDir::Files,QDirIterator::Subdirectories);
    while (where_are_you.hasNext())
    {
        where_are_you.next();
        if (where_are_you.fileInfo().fileName() == "lualatex")
        {
            if (LaTeX_Path.isEmpty())
                LaTeX_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für LaTeX gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(LaTeX_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) LaTeX_Path = where_are_you.fileInfo().canonicalPath();
        }
        if (where_are_you.fileInfo().fileName() == "lilypond-book")
        {
            if (Lilypond_Path.isEmpty())
                Lilypond_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für Lilypond gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(Lilypond_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) Lilypond_Path = where_are_you.fileInfo().canonicalPath();
        }

        if (where_are_you.fileInfo().fileName() == "gregorio")
        {
            if (Gregorio_Path.isEmpty())
                Gregorio_Path = where_are_you.fileInfo().canonicalPath();
            else if (QMessageBox::question(this,tr("Notatio Antiqua"),
                                           tr("Es wurden mehrere Pfade für Gregorio gefunden:\n"
                                              "bereits gefundener Pfad: %1\n"
                                              "neu gefundener Pfad: %2\n"
                                              "Wollen Sie den neu gefundenen Pfad als Anwendungspfad festlegen?")
                .arg(Gregorio_Path)
                .arg(where_are_you.fileInfo().canonicalPath()),
                QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) Gregorio_Path = where_are_you.fileInfo().canonicalPath();
        }


    }
#endif
    QSettings* preferences = new QSettings(QSettings::IniFormat,QSettings::UserScope,"DGSOFTWARE", "Notatio Antiqua"); // Speichern der Ini-Datei
    preferences->beginGroup("Paths");
    preferences->setValue("latexPath",LaTeX_Path);
    preferences->setValue("gregorioPath",Gregorio_Path);
    preferences->setValue("lilypondPath",Lilypond_Path);
    preferences->endGroup();
    preferences->beginGroup("Font");
    QFont saveFont;
    saveFont.setFamily("Courier New");
    preferences->setValue("standardFont",saveFont.family());
    preferences->endGroup();
    QMessageBox::information(this,tr("Notatio Antiqua"),
                          tr("Die Pfade wurden gefunden und eingetragen. Folgende Pfade sind festgelegt worden:\n LuaLaTeX: %1\n Lilypond: %2\n Gregorio: %3.\n"
                             "Sollten diese Pfade nicht mehr Ihren Standardeinstellungen entsprechen, können Sie diese unter Extras->Einstellungen ändern oder diese Initialisierung erneut ausführen.")
                             .arg(LaTeX_Path)
                             .arg(Lilypond_Path)
                             .arg(Gregorio_Path));
}
QtCreator 2.5 beta und Qt Libraries 4.8.0 auf MacOS X 10.7.3
Antworten