2

我正在为 Cocoa 应用程序开发一个插件,为了使用现有的 cpp 代码,我们决定通过 Objective-C++ 将 Cocoa 插件与我们现有的 Qt 项目结合起来,这需要大量学习但即将到来出色地。

无论如何,我被我目前的问题难住了。该插件的设计使得应用程序为我们提供了一个 NSWindow,其中包含两个 NSView。我们在这两个视图之一中放置了一个 QMacNativeWidget,并且那里的一切工作正常。我遇到的问题是,当我尝试从我们的插件中创建一个新的 QDialog() 时,QDialog 总是在包含插件的 NSWindow 后面。

无论我是否 raise() 新的 QDialog,NSWindow 总是在前面,即使它立即失去 QDialog 的键盘焦点。如果我移动 NSWindow,我可以看到它后面的 QDialog,但即使我点击它的标题栏并移动它,它仍然在 NSWindow 后面。

只是想知道是否有人在混合 NSWindows 和 QDialogs 时遇到过类似的问题,以及是否有任何可能的解决方案,除了将我的 QDialog 包装在另一个 QMacNativeWidget 中,然后将它放在另一个 NSWindow 中,我宁愿不必这样做,因为我有许多对话框。

谢谢。

4

1 回答 1

1

我正在做类似的事情(Qt 作为原生 Cocoa 应用程序的插件)。我用 null 父级构造了我的模态 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]
于 2011-11-09T21:18:12.560 回答