Подтвердить что ты не робот

Как запустить связанное приложение для файла/каталога/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. Это дает мне достаточно гибкости для достижения именно того, что я хочу за какой-то счет...

4b9b3361

Ответ 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));