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

QT app starting another app in OSX

本文关键字:应用程序 启动 另一个 OSX QT      更新时间:2023-10-16

我当前正在开发一个代理" apent.app",该代理必须扫描您的USB端口,如果它检测到USB设备,则应用程序启动了一个名为" filebrowser.app"的应用程序。<<<<<<<<<<

我希望Agent.App位于FileBrowser.App中以避免多个应用程序。

我的第一个应用程序FileBrowser是在QT创建者下的QT/C 中开发的。我还在QT创建者下开发了Ament.App。

我认为我需要在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;
}

这是我主要可以做的最糟糕的事情,如果应用程序不在应用程序中。

我确实有2个问题:

  • 当代理在filebrowser.app内部?
  • 时,如何允许Agent.App启动FileBrowser.App。
  • 如何确保Agent.App将包含在FileBrowser.App中?

非常感谢

我希望Agent.App位于FileBrowser.App中以避免多个应用程序。

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

如何确保将Agent.App包含在FileBrowser.App中?

编译两个程序后,将Agent.App文件夹移动到fileBrowser.app/contents/resources文件夹中。您可以使用shell命令或bash脚本来执行此操作,或者只是在filebrowser.app上右键单击。。

如何允许Agent.App启动FileBrowser.App当代理时 是在FileBrowser.app?

您要做的第一件事就是找到"代理"可执行文件所在的目录的路径。幸运的是,QT有一种方法:您只需调用qapplication :: applicationdirpath()。P>

因此,例如,如果将您的fileBrowser.App放置在/申请中,并且将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 Process Exits退出,System()呼叫才会返回,这将具有冻结您的GUI的副作用。