leowong87 2022-07-08 09:16 采纳率: 60%
浏览 214

通过qml标签如何获取HWND的问题

问题遇到的现象和发生背景

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都是需要基于控件句柄
  进行渲染的。希望各位不吝赐教,感激不尽。
  • 写回答

2条回答 默认 最新

  • 「已注销」 2022-07-08 09:37
    关注

    你得视频怎么得到的

    评论

报告相同问题?

问题事件

  • 创建了问题 7月8日

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的