c++ - 在 QGraphicsScene 上使用 native 窗口句柄 (HWND) 在 QWidget 中显示来自设备驱动程序的视频

标签 c++ qt video hwnd

这与我之前的问题有关 Qt GLWidget in GraphicsScene for fast video display from image data (C++ , Windows)? .

我一直在通过 QGraphicsScene/View 中的 QPixMapItem 转换和显示视频帧,即不使用 OpenGL。 转换导致处理器负载,可以通过让所述设备驱动程序直接绘制到窗口来避免,任何缩放问题暂时搁置。

虽然我能够将视频显示给独立的 QWidget->winID()(QWidget、HWND、Qt::WA_NativeWindow,另请参阅 Using Qt with DirectX?),但将此小部件添加到场景中不会产生视频(它是不可见的)。从 QPixMapItem 多重继承以能够使用 QGraphicsScene::addItem() (“此场景拥有该项目的所有权。”)也无济于事。

当对象成为场景的子对象时,它是否会丢失其 WId? 不幸的是,必须关闭其他东西,即使在项目的构造函数中加载 QImage 时,也不会显示任何内容。我将不得不进一步调查。

编辑 1: 继承自 QWidget 和 QGraphicsPixmapItem 的类能够显示像素图,正如使用 myWidget->setPixmap( QPixmap::fromImage( QImage("test.png") ) ); 测试的那样。我以前的图像加载器完全坏了。

在 GraphicsView 顶部显示小部件会很棘手,因为必须实现缩放和 View 外位置,但我怀疑这是否会出现故障(而且我认为这是相当多的工作) .

最佳答案

QGraphicsScene 中显示 QWidget 非常棘手。参见 QGraphicsProxyWidget描述以获取更多信息。基本上,您在 QGraphicsView 中看到的小部件不是真实小部件。 QGraphicsView 只是将绘制事件重定向到底层不可见的 QWidget。显然,Qt 对您的视频重定向一无所知,因此无法将其转换为场景。

我认为你不应该把你的小部件放在场景中。例如,考虑将其放置在图形 View 上方。

关于c++ - 在 QGraphicsScene 上使用 native 窗口句柄 (HWND) 在 QWidget 中显示来自设备驱动程序的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17239941/

相关文章:

qt - 我们如何在没有任何JavaScript的情况下在QML中声明枚举?

c++ - Qt : addToJavaScriptWindowObject and switch QWebView content

video - 如何使用 HTML 5 网络应用程序(使用 Sencha touch 或其他方式)在 iPad 上离线播放视频

css - 在视频标签上放置一个按钮

c++ - 如何从 std::initializer_list 构建类似 std::array 的数据结构

c++ - 为什么没有针对未使用的临时文件的 gcc/g++ 警告?

c++ - 每次重复使用一个容器或声明一个新容器

c++ - Qt Creator 需要一个编译器设置来构建

video - 查找实际的 RTMP 流 URL?

c++ - Boost regex 不替换在 regex 网站上正确替换的表达式