如何启动文件/目录/ URL的关联应用程序?

Ali*_*Ali 11 c++ winapi qt cross-platform shellexecute

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我唯一的选择吗?


编辑我认为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";
Run Code Online (Sandbox Code Playgroud)

应用输出:

Exists?  true 
"C:/Documents and Settings/ali" 
External app called 
Run Code Online (Sandbox Code Playgroud)

但没有任何反应,目录未打开.在Linux上,按预期使用默认文件管理器打开目录.


解决方案:由于Qt错误 Windows怪癖(格式错误的应用程序窗口),我最终使用了ShellExecute.这给了我足够的灵活性来实现我想要的一些费用......

Nik*_* C. 17

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

QDesktopServices::openUrl(QUrl("/home/realnc/test.pdf"));
Run Code Online (Sandbox Code Playgroud)

这将在Acrobat Reader中打开文档.通常,它遵循我的操作系统中针对具有一个或多个与之关联的应用程序的所有文件类型的首选应用程序设置.最重要的是,它与平台无关.

编辑:它在Linux上打开目录而不是在Windows上打开目录的事实闻起来像一个bug.最好在Qt的bug追踪器上报告这个.与此同时,当文件是目录时,您可以使用Windows的解决方法:

#ifdef Q_WS_WIN
    if (QFileInfo(path).isDir())
        QProcess::startDetached("explorer", QStringList(path));
    else
#endif
        QDesktopServices::openUrl(QUrl(path));
Run Code Online (Sandbox Code Playgroud)

您也可以使用cmd.exe的启动命令来执行此操作,但是您会在几分之一秒内弹出一个丑陋的终端:

QProcess::startDetached("cmd", QStringList() << "/C" << "start"
                               << QDir::toNativeSeparators(path));
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

7159 次

最近记录:

13 年,4 月 前