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

时间:2015-05-05 22:41:05

标签: c++ macos qmake macdeployqt

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

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

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

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

我在代理商中所做的是:

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中,这是我能做的最糟糕的事情。

我有2个问题:

  • 当代理在FileBrowser.app中时,如何允许agent.app启动FileBrowser.app?
  • 如何确保agent.app将包含在FileBrowser.app?

非常感谢

1 个答案:

答案 0 :(得分:0)

  

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

您是否考虑过只有一个程序包含两个应用程序的功能,并选择(在main()内部)基于例如执行哪些功能。命令行参数?这将更容易实现,并且还会使您的安装包更小。那说......

  

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

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

  

如何允许agent.app在代理时启动FileBrowser.app   在FileBrowser.app中?

你要做的第一件事就是找到你的“代理”可执行文件所在目录的路径。幸运的是,Qt有一个方法:你可以调用QApplication::applicationDirPath()

因此,例如,如果您的FileBrowser.app放在/ Applications中,而agent.app放在FileBrowser.app/Contents/Resources中(如上所述),那么上面的函数调用将返回一个像“ /Applications/FileBrowser.app/Contents/Resources/agent.app/Contents/MacOS”。

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

// 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的QProcess API启动FileBrowser进程可能比通过调用system()获得更好的行为 - 特别是,在FileBrowser进程退出之前,system()调用不会返回,这会产生冻结代理GUI的副作用。