如何在Mac上的可停靠Qt应用程序中获取唯一的WindowRef

时间:2009-07-20 11:13:56

标签: macos qt

如何从包含Mac上停靠窗口的Qt应用程序中获取唯一的WindowRef?

我的代码归结为:

int main(int argc, char* argv[])
{
   QApplication* qtApp = new QApplication(argc, argv);
   MyQMainWindow mainwin;
   mainwin.show();
}

class MyQMainWindow : public QMainWindow
{
   //...
   QDockWidget* mDock;
   MyQWidget* mDrawArea;
   QStackedWidget* mCentralStack;
};

MyQMainWindow::MyQMainWindow()
{
   mDock = new QDockWidget(tr("Docked Widget"), this);
   mDock->setMaximumWidth(180);
   //...
   addDockWidget(Qt::RightDockWidgetArea, mDock);

   mDrawArea = new MyQWidget(this);
   mCentralStack = new QStackedWidget();
   mCentralStack->addWidget(mDrawArea);
   // Other widgets added to stack in production code.

   setCentralWidget(mCentralStack);

   //...
}

(如果上述语法在语法上不正确,则表示道歉,说明比描述更容易。)

我在上面的构造函数的末尾添加了以下临时代码:

HIViewRef view1 = (HIViewRef) mDrawArea->winId();
HIViewRef view2 = (HIViewRef) mDock->winId();

WindowRef win1 = HIViewGetWindow(view1);
WindowRef win2 = HIViewGetWindow(view2);

我的问题是view1view2不同,但win1win2是相同的!

我在Windows上尝试了以下等效项:

HWND win1 = (HWND)(mCentralDrawArea->winId());
HWND win2 = (HWND)(mDock1->winId());

这一次win1win2不同。

我需要将窗口句柄传递给第三方SDK,以便它只能绘制到中心区域。

顺便说一句,我很欣赏winId()方法带有很多可移植性警告,但对我来说,一个重要的重构是不可能的。使用Carbon而不是Cocoa也是如此。

感谢。

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我联系了Qt,他说这是预期的行为,并且第三方应用程序要求像这样的windowref是不寻常的。他们建议在窗口小部件上查看窗口小部件属性Qt::WA_PaintOnScreenQt::WA_NoSystemBackground

除此之外,我想修复将是请求编辑第三方SDK以获取碳/可可窗口句柄。