Linux кажется, легко: xdg-open <file/directory/URL>
,
По-видимому, макинтош похож: open
следует использовать вместо xdg-open
, У меня нет доступа к Mac, поэтому я не смог его протестировать.
За Windows, Я нашел 4 разных предложения, и те, которые я попробовал, потерпели неудачу.
Существует ли не Java-кроссплатформенный способ запуска связанного приложения для файлов определенного типа?
предполагает start
Как сфокусироваться на программе по умолчанию для открытого файла оболочки из Java? предполагает
cmd /c start ...
Как открыть пользовательский системный редактор для данного файла?
Как узнать по умолчанию открывалка файлов с Java?
предложить
RUNDLL32.exe
Как правильно использовать ShellExecute () в C, чтобы открыть .txt
Открыть файл с родной программой Windows в коде C ++
Как использовать ShellExecute для открытия HTML-файлов в Windows, используя C ++? предложить
ShellExecute
Я пробовал первые 3 с system()
а также QProcess::startDetached()
а также "http://www.stackoverflow.com"
как аргумент, но все они потерпели неудачу; start
работает нормально из командной строки, хотя. Я не пробовала ShellExecute
еще.
Что является эквивалентом Windows xdg-open
? Мне кажется, это start
но почему мои попытки start
потерпеть поражение?
Является ShellExecute
мой единственный вариант?
РЕДАКТИРОВАТЬ я думал 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 а также Причуды Windows (неправильно сформированное окно приложения), в итоге я использовал ShellExecute
, Это дает мне достаточно гибкости, чтобы достигнуть именно того, чего я хочу, за некоторые деньги …
Почему бы вам просто не использовать поддержку Qt для этого? Например:
QDesktopServices::openUrl(QUrl("/home/realnc/test.pdf"));
Это открывает документ в Acrobat Reader. В целом, он подчиняется предпочтительным настройкам приложения в моей ОС для всех типов файлов, с которыми связано одно или несколько приложений. Лучше всего, он не зависит от платформы.
Редактировать:
Тот факт, что он открывает каталоги в Linux, но не в Windows, пахнет как ошибка. Возможно, лучше сообщить об этом на Трекер ошибок Qt. В то же время, вы можете обойти Windows, если файл является каталогом:
#ifdef Q_WS_WIN
if (QFileInfo(path).isDir())
QProcess::startDetached("explorer", QStringList(path));
else
#endif
QDesktopServices::openUrl(QUrl(path));
Вы также можете сделать это с помощью команды запуска cmd.exe, но в течение нескольких долей секунды вы увидите уродливый терминал:
QProcess::startDetached("cmd", QStringList() << "/C" << "start"<< QDir::toNativeSeparators(path));
Других решений пока нет …