首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT应用程序在OSX中启动另一个应用程序

QT应用程序在OSX中启动另一个应用程序
EN

Stack Overflow用户
提问于 2015-05-05 22:41:04
回答 1查看 578关注 0票数 1

我目前正在开发一个代理"Agent.app“,它必须扫描您的usb端口,如果它检测到usb设备,应用程序启动一个名为"Filebrowser.app”的应用程序。

我希望Agent.app位于Filebrowser.app内部,以避免多个应用程序。

我的第一个应用程序FileBrowser是在Qt/c++下在QT创建者下开发的。我还在Qt下开发了Agent.app,但它只是一个与Qt无关的C++类。

我想我需要在agent.pri中声明FileBrowser.pri,以确保FileBrowser.app将包括它。

我在特工中所做的是:

代码语言:javascript
复制
int main()
{
    PulsUsbDetection *MyUSBDevice = new PulsUsbDetection;

    if(MyUSBDevice->isPulsConnected() == true) {
        char *filepath = "/Applications/puls_connect.app";
        string command = "open " + filepath;
        system(command.c_str());
    }

    return 0;
}

这是我能做的最糟糕的事情,主要是如果应用程序不在Application.app中的话。

我有两个问题:

  • 如何允许agent.app在代理位于FileBrowser.app内时启动FileBrowser.app?
  • 如何确保agent.app将包括在FileBrowser.app中?

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2015-05-06 04:24:28

我希望Agent.app位于Filebrowser.app内部,以避免多个应用程序。

您是否考虑过只有一个程序包含两个应用程序的功能,并选择(在main()中)根据命令行参数执行哪些功能?这将更容易实现,并将使您的安装包小得多。上面说..。

如何确保agent.app将包括在FileBrowser.app中?

编译两个程序之后,将agent.app文件夹移到FileBrowser.app/Content/Resources文件夹中。您可以使用shell命令或bash脚本进行操作,或者只需右键单击FileBrowser.app图标,从菜单中选择"Open“,然后打开Contents子文件夹并拖动agent.app。

如何允许agent.app在代理位于FileBrowser.app内时启动FileBrowser.app?

首先要做的是找到您的“代理”可执行文件所在的目录的路径。幸运的是,Qt有一个这样的方法:您只需调用QApplication::applicationDirPath()

因此,例如,如果您的"/Applications/FileBrowser.app/Contents/Resources/agent.app/Contents/MacOS".放在/Applications中,而agent.app放在FileBrowser.app /Content/Resources中(如上面所建议的那样),那么上面的函数调用将返回一个类似于/Applications的字符串

第二步是从该字符串派生到FileBrowser应用程序的路径。这应该是直截了当的:

代码语言:javascript
复制
// This code to be run in the agent app, to launch the FileBrowser app...
QString agentExecutableDirPath = QApplication::applicationDirPath();
QString fileBrowserExecutablePath = agentExecutableDirPath + "../../../../MacOS/FileBrowser";
system(QFile::encodeName(fileBrowserExecutablePath).constData());  // run it

请注意,使用Qt的FileBrowser API启动QProcess进程的行为可能比调用system()更好--特别是,在FileBrowser进程退出之前,FileBrowser()调用不会返回,这在此之前会产生冻结代理GUI的副作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30064432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档