Как запустить связанное приложение для файла/каталога/URL-адреса?
Linux кажется легким: xdg-open <file/directory/URL>
.
По-видимому, Mac похож: open
следует использовать вместо xdg-open
. У меня нет доступа к Mac, поэтому я не смог его протестировать.
Для Windows я нашел 4 разных предложения, и те, которые я пробовал, потерпели неудачу.
Я пробовал первые 3 с system()
и QProcess::startDetached()
и "http://www.stackoverflow.com"
как аргумент, но все они потерпели неудачу; start
работает отлично от командной строки. Я еще не пробовал ShellExecute
.
Что такое эквивалент Windows xdg-open
? Мне кажется, это start
, но почему мои попытки с start
завершились с ошибкой?
Является ли ShellExecute
моей единственной опцией?
EDIT Я думал, что QDesktopServices::openUrl()
предназначен для веб-страниц только потому, что он не работает для файлов или каталогов.
После некоторой отладки я понял, что если я заменил \\
на /
в пути в Windows, он будет работать для файлов, но каталоги все еще не будут открыты. Любые идеи, что я делаю неправильно?
QDir dir("C:/Documents and Settings/ali");
qDebug() << "Exists? " << dir.exists();
qDebug() << dir.absolutePath();
QDesktopServices::openUrl(QUrl(dir.absolutePath()));
qDebug() << "External app called";
Выход приложения:
Exists? true
"C:/Documents and Settings/ali"
External app called
Но ничего не происходит, каталог не открывается. В Linux каталоги открыты с файловым менеджером по умолчанию, как ожидалось.
РЕШЕНИЕ: Из-за ошибки Qt и quirks Windows (неправильное окно приложения) я закончил использование ShellExecute
. Это дает мне достаточно гибкости для достижения именно того, что я хочу за какой-то счет...
Ответы
Ответ 1
Почему бы вам просто не использовать поддержку Qt? Например:
QDesktopServices::openUrl(QUrl("/home/realnc/test.pdf"));
Это открывает документ в Acrobat Reader. В общем, он подчиняется предпочтительным параметрам приложения в моей ОС для всех типов файлов, которые имеют одно или несколько приложений, связанных с ними. Лучше всего, он не зависит от платформы.
Изменить:
Тот факт, что он открывает каталоги на Linux, но не на Windows, пахнет как ошибка. Лучше сообщить об этом в Qt tracker. Тем временем у вас может быть обходное решение для Windows, когда файл является каталогом:
#ifdef Q_WS_WIN
if (QFileInfo(path).isDir())
QProcess::startDetached("explorer", QStringList(path));
else
#endif
QDesktopServices::openUrl(QUrl(path));
Вы также можете сделать это с помощью команды cmd.exe start, но вы получите уродливый терминал для нескольких долей секунды:
QProcess::startDetached("cmd", QStringList() << "/C" << "start"
<< QDir::toNativeSeparators(path));