我正在创建应用程序来分析设备中的数据并将其显示在屏幕上。处理该设备的SDK具有通过设置窗口处理程序(HWND)在特定窗口中显示当前数据帧的功能。
在我的Qt Gui应用程序中,我正在尝试在视频流上显示我自己的小部件,这是一个DLL在我的QGLWidget中显示(由winId函数和HWND设置)。 MainWidget是QGLWidget的父级,其中显示数据流,QWidget(或某些图形标记,例如Circle)应显示在QGLWidget的数据流上方。
一切都近乎完美,但是我正在获得闪烁效果(闪烁效果?) - 我的圈子小部件隐藏并显示人眼可以获得的频率,我试图避免它。只有消除它的选项是创建这个小圈作为小部件并为其Qt :: Popup标志设置,因为它有很大的缺点 - 我无法访问接口的其余部分(我知道,它是Popup标志错误)。我尝试过其他选项:
在文档中,我发现了一些信息,我可以创建自己的directshow + COM对象(或界面,我是对的吗?)处理视频流,但我真的不知道这些技术,我想要避免这个选项!< / p>
[编辑]我发现我可以将当前数据帧作为IPictureDisp接口,但正如我之前所说,我并不真正了解COM技术。我试图找到一些关于如何使用IPictureDisp,但我没有关于COM技术的基本知识。有人有任何关于它的好教程吗?
答案 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();