我有一个场景,当在 Qt 应用程序中打开窗口时,我需要在
QImage
中连续显示来自 QLabel
的帧。
我有 2 个课程涉及此场景:
Camera
(其中缓冲区是从设备生成的)。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
中看到连续的图像流?
感谢您的协助!
您可以使用 Qtimer (https://doc.qt.io/qt-6/qtimer.html),在构造函数中初始化并将计时器连接到槽以定期更新槽。
或者您可以参考此以获得更高效的更新,显示连续的 QImage 流的有效方法