如何从包含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);
我的问题是view1
和view2
不同,但win1
和win2
是相同的!
我在Windows上尝试了以下等效项:
HWND win1 = (HWND)(mCentralDrawArea->winId());
HWND win2 = (HWND)(mDock1->winId());
这一次win1
和win2
不同。
我需要将窗口句柄传递给第三方SDK,以便它只能绘制到中心区域。
顺便说一句,我很欣赏winId()方法带有很多可移植性警告,但对我来说,一个重要的重构是不可能的。使用Carbon而不是Cocoa也是如此。
感谢。
答案 0 :(得分:0)
为了解决这个问题,我联系了Qt,他说这是预期的行为,并且第三方应用程序要求像这样的windowref是不寻常的。他们建议在窗口小部件上查看窗口小部件属性Qt::WA_PaintOnScreen
和Qt::WA_NoSystemBackground
。
除此之外,我想修复将是请求编辑第三方SDK以获取碳/可可窗口句柄。