QML嵌入QWidget子窗口

注意qml和QWidget管理窗口的方式是不一样的。
qml他是某个qml窗口的所有的子组件都和这个父的qml窗口公用同一个winId的,
而某个QWidget窗口下的子Widget控件和其父Widget的winId并不是同一个windId。

所以才导致在使用某些第三方播放器库去设置播放窗口的时候,在用一个qml窗口的情况下,将播放窗口设置为某个子组件,但是最终播放效果却是覆盖了整个qml窗口的原因。
用QWidget就不会出现这种问题。

//qmlParent表示的是要被嵌入的qml窗口。当前的类则是要嵌入的QWidget子窗口
void CPlayWindow::setParentQmlWindow(QWindow *qmlParent)
{
//设置这个 QWidget 的渲染的父窗口句柄,以确保在图形层面上可以正确地管理它与其他窗口之间的关系
this->setProperty("_q_embedded_native_parent_handle",QVariant(qmlParent->winId()));
//设置背景色而已,这里只是为了更好在视觉上区分QWidget子窗口和父QML窗口
this->setStyleSheet("background-color: lightgray; color: naviy;");
this->setGeometry(0,0,1280,720);//设置widget的大小


this->winId();//必须先于windowHandle调用,用来QWidget在内部自动创建一个初始化的窗口对象。后续才能用windowHandle获取对象句柄
this->windowHandle()->setParent(qmlParent);//设置窗口的父对象
...
...
this->show();//注意在后面某个应该显示窗口的时刻(立刻调用也可以)调用show来显示该窗口。
}

其中的关键是第一行和倒数第一第二两行代码。

你可能感兴趣的:(qt,c++,算法)