0

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

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

一切工作几乎完美,但我得到了闪烁效果(闪烁效果?) - 我的圆形小部件正在隐藏并以人眼可以看到的频率显示,我尽量避免它。消除这种情况的唯一选择是将这个圆圈创建为小部件并为其设置 Qt::Popup 标志,因为它有很大的缺点 - 我无法访问其余的界面(我知道,这是 Popup 标志错误)。我尝试了其他选项,例如:

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

在文档中,我发现我可以创建自己的 directshow+COM 对象(或接口,对吗?)来处理视频流,但我并不真正了解这种技术,我非常想避免这个选项!

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

4

1 回答 1

0

试试这个小部件层次结构:

MainWindget
|-QGLWidget
|-MarkerWidet

MarkerWidet应该是一个小的方形小部件。

通过调用确保MarkerWidet在上面。但是打电话之前先打电话。Qt 有一个错误,这个错误通过调用来消除。QGLWidgetMarkerWidet::raise()MarkerWidet::lower()MarkerWidet::raise()QWidget::raise()lower(); raise();

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

伪代码:

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();
于 2013-01-25T14:39:29.987 回答