Pfad von externer Anwendung herausfinden
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
Pfad von externer Anwendung herausfinden
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!
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!
-
- Beiträge: 170
- Registriert: 26. Januar 2009 09:19
- Wohnort: 127.0.0.2
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
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
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 ...
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 ...
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
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
![Smile :)](./images/smilies/icon_e_smile.gif)
@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
![Smile :)](./images/smilies/icon_e_smile.gif)
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
-
- Beiträge: 79
- Registriert: 11. Oktober 2009 00:37
- Wohnort: Dresden
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
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
- MacOSX scheint alle Programme erstmal ohne Pfad auszuführen, jedenfalls um den Programmpfad für die Shell. ![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
Jetzt besteht mein Problem eigentlich nur noch darin, wie MacOS Pfade vergibt. Was haltet ihr von dieser Lösung?
![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
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
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
}
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
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.
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
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
ups, ja, Asche auf mein Haupt ... aber eigentlich sollt es auch %PROGRAMFILES% oder sowas geben ....@RHBaum: Nicht "%WINDIR%\Program Files", sondern "%SYSTEMDRIVE%\Program Files".
jeinUnter Linux ist es doch auch so: Standardmäßig werden Anwendungen unter "/usr" installiert.
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.
Ich mag keine Iteratoren ;-P
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
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
}
![Smile :)](./images/smilies/icon_e_smile.gif)
Alternativ guckst du obs unter mac sowas wie das "which" unter linux gibt und nutzt jeweils die per QProcess
![Smile :)](./images/smilies/icon_e_smile.gif)
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
Hallo und nochmals danke an alle; ich sehe schon die Probleme einer zu starren Suche ![Smile :)](./images/smilies/icon_e_smile.gif)
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
![Smile :)](./images/smilies/icon_e_smile.gif)
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
gibt sicher fuer shell-nachbauten etwas ...Mir ist die Methode über which / kpsewhich recht sympathisch, gibt es denn zu which annähernd ein äquivalent in Windows?
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 ...
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
-
- Beiträge: 21
- Registriert: 30. August 2010 14:51
- Wohnort: Jena
- Kontaktdaten:
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!)
LG Barahir
Sorry für den großen Codeblock, das wird leider immer länger (auch dank eurer Hilfe!)
![Very Happy :-D](./images/smilies/icon_e_biggrin.gif)
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