У меня есть приложение Carbon LSUIElement, которое работает в фоновом режиме (возможно, со значком в строке меню, в зависимости от предпочтения) и иногда ему требуется отображать диалог для пользователя - иногда в ответ на пользовательское событие, но иногда в ответ на сбой фоновой задачи или подобное.
(Я использую Qt 4.5, поэтому приложение основано на углероде; с Qt 4.6 все будет на основе какао, но похоже, что проблема может существовать и там).
Проблема в том, что когда я открываю окно и показываю его, оно не выводится на передний план. Я предполагаю, что это артефакт приложения LSUIElement. Qt использует SelectWindow в Carbon и [makeKeyAndOrderFront] в Какао, чтобы вывести окно (и приложение) на передний план.
Чтобы обойти проблему, я попытался перейти непосредственно к оконному серверу: (первые несколько шагов - получить WindowID, это будет проще с Qt-Cocoa, так как я могу использовать NSWindow: nativeWindow)
WindowRef ref = HIViewGetWindow((HIViewRef) aWidget->winId());
CGSWindow wid = GetNativeWindowFromWindowRef(ref);
CGSConnection cid =_CGSDefaultConnection();
CGSOrderWindow(cid, wid, 1 /* above everything */, 0 /* NULL */);
Это вроде как работает - окно выходит на передний план, но не выделяется и не фокусируется на клавиатуре. Есть ли дополнительные шаги для решения этих проблем или есть более простое решение всей проблемы?