Linux кажется легким: xdg-open <file/directory/URL>.
По-видимому, Mac похож: open следует использовать вместо xdg-open. У меня нет доступа к Mac, поэтому я не смог его протестировать.
Для Windows я нашел 4 разных предложения, и те, которые я пробовал, потерпели неудачу.
-
Существует ли не-java-кросс-платформенный способ запуска связанного приложения для определенного типа файла? предлагает
start -
Как настроить фокус на программу по умолчанию, открытую оболочкой, из Java? предлагает
cmd /c start ... -
Как открыть предпочтительный редактор системы для данного файла? Как найти открыватель файлов по умолчанию с Java? предложить
RUNDLL32.exe -
Каков правильный способ использования ShellExecute() в C, чтобы открыть .txt
Откройте файл с собственной программой Windows в коде С++
Как использовать ShellExecute для открытия html файлов в Windows с использованием С++? предложитьShellExecute
Я пробовал первые 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. Это дает мне достаточно гибкости для достижения именно того, что я хочу за какой-то счет...