C++ 如何在qt、opencv中逐个显示目录中的所有图像
我尝试在QT Creator中创建GUI应用程序。若要显示所选目录中的所有图像(一种幻灯片放映),我阅读了QDir、QStringlist、QFileDialog类引用,但它不起作用。它只显示文件夹中的最后一个图像C++ 如何在qt、opencv中逐个显示目录中的所有图像,c++,qt,C++,Qt,我尝试在QT Creator中创建GUI应用程序。若要显示所选目录中的所有图像(一种幻灯片放映),我阅读了QDir、QStringlist、QFileDialog类引用,但它不起作用。它只显示文件夹中的最后一个图像 for(int i=0;i<10;i++) { QImage image2(directory+"/"+fileList[i]); ui->label_pic2->setPixmap(QPixmap::fromImage(image2));
for(int i=0;i<10;i++)
{
QImage image2(directory+"/"+fileList[i]);
ui->label_pic2->setPixmap(QPixmap::fromImage(image2));
//Sleep(550);
}
for(inti=0;ilabel_pic2->setPixmap(QPixmap::frommage(image2));
//睡眠(550);
}
睡眠功能只会使加载速度变慢,而不会一个接一个地显示。首先,您需要了解GUI只有在代码未执行时才会更新,并且应用程序可以处理传入的数据。如果您创建一个无休止的循环,您的GUI将永远不会更新。这就是为什么您只能看到最后一个图像的原因,因为您不允许GUI被更新特德 您可以通过
QCoreApplication::processEvents()强制应用程序处理传入事件
。在这种情况下,您可能会看到图像快速闪烁。但在显示每个图像后,您肯定需要暂停。您的睡眠可能会在那里工作,但在暂停期间,您的应用程序将被冻结,无法处理事件
这就是为什么建议您使用QTimer
。它会在一定时间内调用一个插槽。所有其他时间应用程序都在处理消息和更新GUI等。调用插槽时,您可以切换标签
,以显示下一个图像。这正是您需要的
总结:
1.创建一个QTimer
,设置间隔并将其连接到插槽,启动计时器。
2.在插槽实现中,读取列表中的下一个图像,并将其分配给标签
要跟踪显示的图像,请创建一个INTEGER成员变量。启动动画时将其设置为0,在插槽中增加它。Qt是基于事件的。最简单的方法是使用QTimer。决不要通过睡眠来阻止主线程。@hyde QTimer的工作方式类似于睡眠。没有区别。只有最后一个图像加载延迟5s等。我想看看屏幕上的幻灯片放映。“没有区别。”-这是一个相当权威的声明,考虑到您遇到了技术问题,有人在向您指出解决方案的方向……而您没有尝试看它是否有帮助。更好的反应可能是一个问题,如“使用QTimer和sleep有什么区别?”@Otantik,您可以尝试调用QCoreApplication::processEvents()
在睡觉前让你的标签自己重新绘制,然而@hyde提出的基于计时器的解决方案似乎是更好的方法。@Otantik在非常高级的意义上,允许你的代码在X秒后被调用,QTimer
就像睡觉一样。然而,最大的区别是,QTimer
会工作,而睡觉则不会t(因为它停止Qt事件循环,在睡眠期间不会发生任何事情)。