В настоящее время я разрабатываю агент «Agent.app», который должен сканировать ваш USB-порт, и если он обнаруживает USB-устройство, приложение запускает приложение под названием «Filebrowser.app».
Я хочу, чтобы Agent.app находился внутри Filebrowser.app, чтобы избежать нескольких приложений.
Мое первое приложение FileBrowser разработано на Qt / c ++ под QT Creator. Я также разработал Agent.app под Qt Creator, но это просто класс C ++, не имеющий отношения к Qt.
Я думаю, что мне нужно, чтобы agent.pri был объявлен внутри FileBrowser.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 вопроса:
большое спасибо
Я хочу, чтобы Agent.app находился внутри Filebrowser.app, чтобы избежать нескольких приложений.
Рассматривали ли вы наличие только одной программы, которая включает в себя функциональность обоих приложений и выбирает (внутри main ()), какую функциональность выполнять, например, на основании: аргумент командной строки? Это будет легче реализовать, а также сделает ваш установочный пакет намного меньше. Это сказал …
Как убедиться, что agent.app будет включен в FileBrowser.app?
После компиляции обеих программ переместите папку agent.app в папку FileBrowser.app/Contents/Resources. Для этого можно использовать команду оболочки или сценарий bash или просто щелкнуть правой кнопкой мыши значок FileBrowser.app, выбрать в меню «Открыть пакет», а затем открыть подпапки «Содержимое и ресурсы» и перетащить agent.app в ,
Как разрешить 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
Обратите внимание, что вы, вероятно, получите более приятное поведение при запуске процесса FileBrowser с использованием Qt QProcess API, чем при вызове system () — в частности, вызов system () не будет возвращаться до тех пор, пока не завершится процесс FileBrowser, что будет иметь побочный эффект замораживания графического интерфейса вашего агента до тех пор.