【问题标题】:Qt: How to open file by external programm, "open with..." dialogQt:如何通过外部程序打开文件,“打开方式...”对话框
【发布时间】:2016-07-09 11:43:33
【问题描述】:

如何通过关联的外部程序打开文件,如果失败,则调用“打开方式...”对话框?

它可以是平台无关的代码吗?或者我需要使用

#ifdef
#else 
#endif 

为每个平台实现“打开方式...”对话框调用的构造?

提前致谢

编辑:更新,经过几个小时的研究,我找到了适用于 Windows 的好解决方案。

我们尝试使用 ShellExecute(...) 打开文件,如果失败并出现文件关联错误,我们通过“open as”Shell32.dll 对话框打开文件

QString file_path = "C:\VeryGoodPath.txt";
int iResult = (int)ShellExecuteA(0, 0, file_path.toStdString().c_str(), 0, 0 , SW_SHOW );
if(iResult>32)
{
    // Succesful run
}
else
{
    if(SE_ERR_ASSOCINCOMPLETE==iResult)
    {
        QString ShellCmd = "C:\\Windows\\system32\\shell32.dll,OpenAs_RunDLL \""+file_path +"\"";
        ShellExecuteA(0,"open", "C:\\Windows\\system32\\rundll32.exe",ShellCmd.toStdString().c_str(),NULL, SW_NORMAL);
    }
    else
    {
        // Errors
    }
}

EDIT2:问题是,我不使用

 QDesktopServices::openUrl(...)

这个函数

 QUrl::fromLocalFile("<path_to_your_file>")

【问题讨论】:

  • 在 Windows 上调用“打开方式”对话框的正确方法是将目标文件名传递给 ShellExecute/Ex(),指定 "openas" 动词。不要直接调用shell32的OpenAs_RunDLL。见stackoverflow.com/questions/6364879

标签: c++ qt file winapi shell32.dll


【解决方案1】:

一种简单的方法是使用QDesktopServices::openUrl

QDesktopServices::openUrl(QUrl::fromLocalFile("<path_to_your_file>"));

这样你就可以让操作系统来处理它了。如果一个程序与该文件(或一般的 URL。您也可以使用此功能在默认浏览器中打开一个 url)相关联,操作系统将启动它或显示默认的“打开方式”对话框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多