如何在外部库处理的设备上显示QWidget上面的数据流

时间:2013-01-25 07:49:02

标签: c++ qt com directshow

我正在创建应用程序来分析设备中的数据并将其显示在屏幕上。处理该设备的SDK具有通过设置窗口处理程序(HWND)在特定窗口中显示当前数据帧的功能。

在我的Qt Gui应用程序中,我正在尝试在视频流上显示我自己的小部件,这是一个DLL在我的QGLWidget中显示(由winId函数和HWND设置)。 MainWidget是QGLWidget的父级,其中显示数据流,QWidget(或某些图形标记,例如Circle)应显示在QGLWidget的数据流上方。

一切都近乎完美,但是我正在获得闪烁效果(闪烁效果?) - 我的圈子小部件隐藏并显示人眼可以获得的频率,我试图避免它。只有消除它的选项是创建这个小圈作为小部件并为其Qt :: Popup标志设置,因为它有很大的缺点 - 我无法访问接口的其余部分(我知道,它是Popup标志错误)。我尝试过其他选项:

  • 设置Qt :: WindowStaysOnTopHint和其他一些标志,
  • 创建布局对象,其中父级是QGLWidget,我在那里显示来自设备的数据,而不是将圆形小部件设置为布局项目,但是这里黑色背景是阴影显示的数据(我甚至关闭了背景,但我'我意识到Qt无法知道我的小部件下面是什么,因为它是由外部库处理的。)

在文档中,我发现了一些信息,我可以创建自己的directshow + COM对象(或界面,我是对的吗?)处理视频流,但我真的不知道这些技术,我想要避免这个选项!< / p>

[编辑]我发现我可以将当​​前数据帧作为IPictureDisp接口,但正如我之前所说,我并不真正了解COM技术。我试图找到一些关于如何使用IPictureDisp,但我没有关于COM技术的基本知识。有人有任何关于它的好教程吗?

1 个答案:

答案 0 :(得分:0)

尝试此窗口小部件层次结构:

MainWindget
|-QGLWidget
|-MarkerWidet

MarkerWidet应该是一个小方块小部件。

通过致电MarkerWidet,确保QGLWidget高于MarkerWidet::raise()。 但在致电MarkerWidet::lower()之前请致电MarkerWidet::raise()。 Qt与QWidget::raise()存在错误,通过调用lower(); raise();可以消除此错误。

启动应用程序后,检查实际的窗口小部件层次结构,使用Spy ++来完成它。可以在Visual Studio安装中找到Spy ++,也可以下载here

伪代码:

MainWindget* mainWidget = new MainWindget;
QGLWidget* glWidget = new QGLWidget(mainWidget);
device->setHwnd(glWidget->winId());
mainWidget->show();
...
MarkerWidet* marker = new MarkerWidet(mainWidget);
marker->resize(30, 30);
marker->move(10, 10);
marker->lower();
marker->raise();