11

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

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

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

我已经尝试过使用system()andQProcess::startDetached()"http://www.stackoverflow.com"作为参数的前 3 个,但它们都失败了;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. 这给了我足够的灵活性,可以以一定的代价实现我想要的……

4

1 回答 1

17

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

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

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

编辑:它在 Linux 上打开目录而不是在 Windows 上打开目录的事实闻起来像一个错误。最好在Qt 的 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));
于 2012-12-07T16:33:57.113 回答