这与我之前的问题有关 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/