Как запустить соответствующее приложение для файла / каталога / URL?

Linux кажется, легко: xdg-open <file/directory/URL>,

По-видимому, макинтош похож: open следует использовать вместо xdg-open, У меня нет доступа к Mac, поэтому я не смог его протестировать.

За Windows, Я нашел 4 разных предложения, и те, которые я попробовал, потерпели неудачу.

Я пробовал первые 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, Это дает мне достаточно гибкости, чтобы достигнуть именно того, чего я хочу, за некоторые деньги …

11

Решение

Почему бы вам просто не использовать поддержку 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));
17

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]