我的C++程序创建了一个.png文件,我需要在创建后立即打开(查看)它——有没有一种方法可以像在Windows资源管理器中打开文件一样打开它,以便文件将使用用户首选的程序打开,如果没有与文件格式关联的程序,则Windows将显示对话框窗口,在其中用户将能够选择任何程序来打开该文件。
跨平台(+Linux,+MacOS,+BSD)解决方案将是完美的。
谢谢。
跨平台(+Linux,+MacOS,+BSD)解决方案将是完美的。
谢谢。
quintptr returnValue = (quintptr)ShellExecute(0, 0,
(wchar_t*)filePath.utf16(), 0, 0, SW_SHOWNORMAL);
// ShellExecute returns a value greater than 32 if successful
return (returnValue > 32);
在这里,filePath.utf16()是以Unicode编码的以null结尾的文件路径。
以下是X11 / Unix的相关部分:
if (launch(url, QLatin1String("xdg-open")))
return true;
if (X11->desktopEnvironment == DE_GNOME
&& launch(url, QLatin1String("gnome-open"))) {
return true;
} else {
if (X11->desktopEnvironment == DE_KDE
&& launch(url, QLatin1String("kfmclient exec")))
return true;
}
if (launch(url, QLatin1String("firefox")))
return true;
if (launch(url, QLatin1String("mozilla")))
return true;
if (launch(url, QLatin1String("netscape")))
return true;
if (launch(url, QLatin1String("opera")))
return true;
return false;
file:///home/user/tmp/file.doc
。虽然不确定这是否重要。它还会对URL中的所有非ASCII字符进行百分比编码,然后再将其传递给程序。不确定openDocument()尝试的所有程序是否都需要这样做。我已经使用xdg-open
进行了测试,它无论是否百分比编码都不会有影响。X11->desktopEnvironment
的部分: X11->desktopEnvironment = DE_UNKNOWN;
Atom type;
int format;
unsigned long length, after;
uchar *data = 0;
int rc;
do {
if (!qgetenv("KDE_FULL_SESSION").isEmpty()) {
X11->desktopEnvironment = DE_KDE;
break;
}
if (qgetenv("DESKTOP_SESSION") == "gnome") {
X11->desktopEnvironment = DE_GNOME;
break;
}
// GNOME_DESKTOP_SESSION_ID is deprecated for some reason, but still check it
if (!qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty()) {
X11->desktopEnvironment = DE_GNOME;
break;
}
rc = XGetWindowProperty(X11->display, QX11Info::appRootWindow(), ATOM(_DT_SAVE_MODE),
0, 2, False, XA_STRING, &type, &format, &length,
&after, &data);
if (rc == Success && length) {
if (!strcmp(reinterpret_cast<char *>(data), "xfce4")) {
// Pretend that xfce4 is gnome, as it uses the same libraries.
// The detection above is stolen from xdg-open.
X11->desktopEnvironment = DE_GNOME;
break;
}
// We got the property but it wasn't xfce4. Free data before it gets overwritten.
XFree(data);
data = 0;
}
} while(0);
哇,那真是一件了不起的事情。我已经移除了检测其他环境的部分,因为它们在 openDocument() 中没有用到。
最后,这里是光荣的 Mac 版本 openDocument():
// LSOpen does not work in this case, use QProcess open instead.
return QProcess::startDetached(QLatin1String("open"), QStringList() << file.toLocalFile());
真的吗?就这样了?哇,Mac平台肯定有些东西。在这里,QProcess :: startDetached()只是启动一个新进程,并将文件路径作为参数传递。它在很大程度上等同于system()调用,但不等待进程终止。不确定是否重要,并且我不知道如何在Mac上使用QProcess之外完成它,因为我从未见过Mac。
ShellExecute( GetSafeHwnd(),
_T("open"),
"Test.bmp",
NULL,
NULL,
SW_SHOW);
如果您需要跨平台版本,可以在谷歌上搜索相关信息。
再见
GetSafeHwnd
是 MFC 函数,不是标准 Windows API 的一部分。您只需要指定一个窗口句柄 (HWND
) 即可。 - Cody Gray
system()
命令了吧?这是我能想到的最快捷的跨平台方式,但如果你正在问这个问题,我认为它并不能完全满足你的需求。 - Cody Gray