Смешивание Qt и Какао через QMacNativeWidget - у меня проблемы с отображением QDialog через NSWindow - PullRequest
2 голосов
/ 22 июня 2010

Я работаю над плагином для приложения Какао, и для того, чтобы использовать существующий код cpp, мы решили объединить плагин Какао с нашим существующим проектом Qt через Objective-C ++, который можно было многому изучить на лету, ноидет хорошо.

В любом случае, я поставлен в тупик моей текущей проблемой.Дизайн этого плагина таков, что приложение дает нам NSWindow с двумя NSViews внутри.Мы помещаем QMacNativeWidget, который внутри одного из этих двух представлений, и все там работает нормально.Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь создать новый QDialog () из нашего плагина, QDialog всегда находится за NSWindow, содержащим плагин.

Независимо от того, поднимаю ли я ()Новый QDialog, NSWindow всегда впереди, хотя он сразу теряет фокус клавиатуры на QDialog.Если я перемещаю окно NSW, я вижу QDialog за ним, но даже когда я нажимаю на его заголовок и перемещаю его, он все еще остается за NSWindow.

Просто было интересно, если у кого-то были подобные проблемы ссмешивание NSWindows и QDialogs, и если есть какое-либо возможное решение, кроме оборачивания моего QDialog в другой QMacNativeWidget и последующего помещения его в другое NSWindow, что я бы предпочел не делать, поскольку у меня много диалогов.

1 Ответ

1 голос
/ 10 ноября 2011

Я делаю нечто подобное (Qt как плагин к нативному приложению Cocoa). Я создаю свой модальный QDialog с нулевым родителем, и он ведет себя как модальное приложение и остается на вершине. Ваша проблема заключается в том, чтобы иметь немодальный QMacNativeWidget и модальный QDialog сверху? Я не уверен, что у меня есть такой точный сценарий. Вы устанавливаете QDialog, чтобы иметь нулевого родителя?

В качестве обходного пути вы можете попробовать изменить флажки окна для обеспечения поведения самого верхнего уровня:

// Qt::Tool to stay on top
QDialog* d= new QDialog(0, Qt::Tool);
// And stop the tool window from disappearing on hide
d->setAttribute(Qt::WA_MacAlwaysShowToolWindow);

См. http://doc.qt.nokia.com/latest/qt.html#WindowType-enum

В качестве альтернативы, вы можете попробовать NSWindow setLevel , получив QDialog 'd' (я здесь пропускаю кастинг):

[[d->winId() window] setLevel:some_level]
...