【问题标题】:How to launch the associated application for a file / directory / URL?如何启动文件/目录/URL 的关联应用程序?
【发布时间】:2012-11-25 20:39:10
【问题描述】:

Linux 似乎很简单:xdg-open <file/directory/URL>

显然,Mac 是类似的:应该使用open 而不是xdg-open。我无法使用 Mac,因此无法对其进行测试。

对于 Windows,我发现了 4 个不同的建议,但我尝试过的都失败了。

我已经尝试使用system()QProcess::startDetached()"http://www.stackoverflow.com" 作为参数的前3 个,但它们都失败了; start 在命令行中工作得很好。我还没试过ShellExecute

xdg-open 的 Windows 等效项是什么?在我看来,它是 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。这给了我足够的灵活性,可以以一定的代价实现我想要的……

【问题讨论】:

  • 如果您想通过 system() 执行此操作,则必须调用 cmd /c start whatever 并且可能需要指定 cmd.exe 的完整路径。不过,我认为 ShellExecute() 有更优雅的解决方案。

标签: c++ qt winapi cross-platform shellexecute


【解决方案1】:

为什么不直接使用 Qt 的支持呢?例如:

QDesktopServices::openUrl(QUrl("/home/realnc/test.pdf"));

这将在 Acrobat Reader 中打开文档。一般来说,它遵循我的操作系统中的首选应用程序设置,适用于所有具有一个或多个应用程序关联的文件类型。最重要的是,它独立于平台。

编辑: 它在 Linux 上打开目录而不是在 Windows 上打开目录的事实闻起来像一个错误。最好在Qt's bug tracker 上报告此问题。同时,当文件是目录时,您可以为 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));

【讨论】:

  • 谢谢!请检查我更新的问题:它不适用于 Windows 上的目录。
  • 好的,谢谢,点赞!不幸的是,这会带来一个格式错误的资源管理器窗口(Windows 错误?),但您对此无能为力。 (将 /root 标志传递给 explorer 可以解决该问题。)
  • @Ali 我还发布了使用start 命令执行此操作的代码(不过,如前所述,您会弹出一个命令行窗口。)
  • cmd /C start 在我的机器上不起作用。我得到命令行窗口然后什么也没有发生。我也用你的代码仔细检查了它。有什么想法吗?
  • @Ali start 需要一个参数。例如`start C:\`。我发布的代码反映了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多