Гибридное приложение командной строки / графического интерфейса пользователя wxWidgets не может получить диалоговое окно - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть приложение командной строки, написанное на C ++ и созданное с помощью gcc / make, которое работает на MacOS. Это приложение не имеет собственного графического интерфейса и не должно иметь корневых окон - это консольное приложение, предназначенное для управления другим приложением.

Однако в одной точке необходимо показать диалоговое окно выбора файла, что делает его немного гибридным.

Я использовал wxWidgets для создания диалога, но он не может получить ввод. Я видел в различных часто задаваемых вопросах и группах пользователей, что пакет, вероятно, требуется Когда я попытался создать пакет, это не решило проблему.

Вот как инициализируется wxWidgets:

#ifdef __WXMAC__
    if (!wxEntryStart(argc, argv))
    {
        cout << "Failed to initialize wxWidgets." << endl;
        return 0;  
    }
#endif
    clientApp = new MainClass();
    clientApp->Run(argc, argv);
#ifdef __WXMAC__   
    wxEntryCleanup();
#endif

Когда я пытаюсь показать диалог просмотра файлов, используя этот код, он показывает средство выбора файлов, но не отвечает, действуя так, как будто у него нет сообщения:

#ifdef __WXMAC__
    wxFileDialog* dlg = new wxFileDialog( NULL, _("Upload File"), _(""), _(""),
        _("All Files (*.*)|*.*"), wxFD_OPEN|wxFD_FILE_MUST_EXIST );
    if (dlg->ShowModal() == wxID_CANCEL )
    {
        INFOLOG("File upload dialog has been cancelled." << endl )
        return false;
    }
#endif

Поскольку в часто задаваемых вопросах говорится, что создание пакета - это способ автоматически создать насос сообщений и сделать графический интерфейс отзывчивым. Я попытался создать пакет:

myapp.app -> Содержание -> MacOS -> myapp (исполняемый файл) -> cert.crt (SSL-сертификат, используемый приложением) -> Ресурсы -> myapp.icns -> Info.plist (указывает на myapp как исполняемый файл и использует myapp.icns в качестве значка)

Приложение, контролирующее это, не принадлежит мне и должно запускаться именно так:

myapp

Управляющему приложению необходимо прочитать консольный вывод этого приложения, и именно поэтому это приложение предназначено только для консоли.

Поскольку исполняемый файл на несколько каталогов глубже, я попытался создать сценарий оболочки в корневом каталоге над пакетом для запуска приложения и вызова его myapp. Myapp просто запускает myapp.app/Contents/MacOS/myapp, перенаправляя параметры командной строки.

Это не сработало. Окно просмотра файлов создается и просто сидит там, давая мне вращающееся колесо радуги каждый раз, когда я на него намываю.

Что я могу сделать, чтобы запустить насос сообщений? Можно ли добавить вызов в код wxWidgets или мне нужно сделать что-то по-другому с пакетом? Запускает ли сценарий оболочки приложение, которое находится внутри пакета, полностью побеждает «магию прокачки сообщений», которую должен дать пакет, и если так, есть ли разумный обходной путь? Нужно ли мне просто создать своего рода псевдо-родителя для wxFileDialog?

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Вы можете сделать ваше приложение полноценным приложением с графическим интерфейсом и просто скрыть главное окно, используя wxWindow :: Show (false).Это даст вам рабочий насос сообщений.Вы все еще должны быть в состоянии поймать stdout и stderror.

1 голос
/ 03 декабря 2010

Я слышал сообщения о том, что альтернативой созданию комплекта приложений является использование следующего кода (который я никогда никому не рекомендую по комплекту, но, похоже, ваша ситуация - хороший повод его использовать):

#include <ApplicationServices/ApplicationServices.h>

ProcessSerialNumber PSN;
GetCurrentProcess(&PSN);
TransformProcessType(&PSN,kProcessTransformToForegroundApplication);

Это, конечно, зависит от платформы, поэтому оберните его соответствующим образом.

У вас есть производные wxApp и wxApp :: OnInit ()?Вероятно, они все еще необходимы для инициализации цикла событий.

...