如何在Qt中打开窗口时用QImage持续更新QLabel?

问题描述 投票:0回答:1

我有一个场景,当在 Qt 应用程序中打开窗口时,我需要在

QImage
中连续显示来自
QLabel
的帧。

我有 2 个课程涉及此场景:

  1. Camera
    (其中缓冲区是从设备生成的)。
  2. Scenarios
    (我需要显示相机图像的地方)。 Scenarios 不是 Qt 的主窗口。这是单击主窗口中的按钮后打开的表单:
    scenarios_->show();

在我的

main
函数中,我编写了以下代码:

...
Scenarios scenarios;
Camera camera(0, argv);
camera.start();
QObject::connect(&camera, SIGNAL(foo(unsigned char *)), &scenarios, SLOT(bar(unsigned char *)));
...

Camera
类发出信号
foo(unsigned char *)
,其中包括:

std::map<unsigned long, unsigned char *> ThermalImages;
unsigned long serial = itDevices->first;
...
getting image
...
emit foo(ThermalImages[serial]);

这部分工作正常。在

Scenarios
类中,在
bar
插槽中,我接收缓冲区并可以从中创建
QImage

QImage thermalImage_;

void Scenarios::bar(unsigned char *thermalImage) {
    thermalImage_ = QImage(thermalImage, 384, 288, QImage::Format_RGB888);
}

现在,问题来了。我想在

QImage
小部件中的特定
QLabel
中显示此
Scenarios
。为了检查缓冲区是否不为空以及
QImage
是否已正确创建,我在显示图像的表单中添加了一个按钮:

void Scenarios::on_button_update_clicked() {
    ui_->label_thermal->setPixmap(QPixmap::fromImage(thermalImage_));
}

如果单击该按钮,则会显示当前帧。然而,我的目标是不断更新

QLabel
,而无需单击按钮。我希望在表单打开时连续显示视频流。我需要一种方法来在每次有新框架可用时自动刷新
QLabel
中的信息。

我尝试在

connect
类的构造函数中使用
Scenarios
,但它似乎只触发一次。

如何解决此问题,以便当窗口打开时,我无需单击按钮即可立即在

QLabel
中看到连续的图像流?

感谢您的协助!

c++ qt signals-slots qlabel qimage
1个回答
0
投票

您可以使用 Qtimer (https://doc.qt.io/qt-6/qtimer.html),在构造函数中初始化并将计时器连接到槽以定期更新槽。

或者您可以参考此以获得更高效的更新,显示连续的 QImage 流的有效方法

© www.soinside.com 2019 - 2024. All rights reserved.