在QGidget中使用QGraphicsScene上的本机窗口句柄(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()("This scene takes ownership of the item.")也无济于事 .

当物体成为场景中的孩子时,物体是否会失去它?不幸的是,即使在项目的构造函数中加载QImage,也不会显示任何其他内容 . 我将不得不进一步调查 .

编辑1:从QWidget和QGraphicsPixmapItem继承的类能够显示像素图,用 myWidget->setPixmap( QPixmap::fromImage( QImage("test.png") ) ); 测试 . 我以前的图像加载器简直被打破了 .

在GraphicsView上显示小部件将会非常棘手,因为必须实现缩放和视图外位置,但我怀疑这将无故障工作(我认为这是相当多的工作) .

回答(1)

2 years ago

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

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