问题遇到的现象和发生背景
QtWiidget转QML,最近把之前做的QtWidget项目做迁移尝试。由于之前的项目用到了海康威视网络摄像头,调用的是海康的SDK进行集成,预览接口需要传入HWND类型的控件句柄,在QtWidget下获取句柄很简单,因为QWidgetItem继承类对象都有 winId()方法,通过(HWND)this->label->winId()可轻松获取句柄进行播放。 在QML下我首先写了一个C++类用于海康sdk调用并注册至QML ,通过Q_INVOKABLE函数接收QML页面中相应标签的ID(QObject类型),想在C++代码内转换接收到的对象成为HWND类型。
问题相关代码,请勿粘贴截图
//注册invokable函数用于接收qml界面的标签id
Q_INVOKABLE void setDisplayWnd(QObject* QMLId);
//注册C++对象
qmlRegisterType<cCom>("Wpc", 1, 0, "ColorMaker");
//接收ID处理
void cCom::setDisplayWnd(QObject* QMLId)
{
//强制转换似乎不行
m_wind=(HWND)QMLId;
QQuickItem* btn= QMLId->findChild<QQuickItem*>("mybtn");
btn->setProperty("text","获取正常");
//获取的是根窗口
QQuickWindow *ww =btn->window();
}
运行结果及报错内容
我在接收函数中确实接收到了qml界面标签的id(Qobject类型),并且通过该标签可以完成包括子控件的查找,说明数据传递没有问题。但是
获取到的控件类型都是QQuickItem,该类不像QWidgetItem有winId()方法,不能通过 (HWND)QQuickItem->winId()来获取SDK需要的句柄。
我的解答思路和尝试过的方法
我在QT帮助中查找winId(),发现QQuick中具有此方法的只有QQuickWindow ,但是我通过btn->window();方法获取到QQuickWindow对象发现是
整个程序的根窗口即ApplicationWindow,这显然与我想在固定标签内播放视频的需求不相符。
我想要达到的结果
请问这种情况下我改如何处理?仔细想想这也算QQuick编程过程中比较普遍的需求吧?因为不少第三方的图像处理类的sdk都是需要基于控件句柄
进行渲染的。希望各位不吝赐教,感激不尽。