1、问题
需求:从海康工业相机硬触发5次,获取5张QImage类型图像数据存储到QVector中,然后再分别显示到界面上,当保存5张QImage类型图像数据到QVector后,遍历QVector中数据时,图像在界面上一直不显示,或只显示最后一张图像,并没有显示5张图像???
代码:
头文件.h
QVector<QImage> *vector_images = new QVector<QImage>();
.cpp文件
connect(m_myGrabImgHread, &MyGrabImg::signals_sendAFrameImg, this,
[=](QImage image, QDateTime dateTime)
{
if (m_nImageNum == 0) {
ui.label_img1->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
ui.label_imgA->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
if (vector_images->size() == 5)
{
vector_images->clear();
}
}
if (m_nImageNum == 1) {
ui.label_img2->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
ui.label_imgA->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
}
if (m_nImageNum == 2) {
ui.label_img3->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
ui.label_imgA->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
}
if (m_nImageNum == 3) {
ui.label_img4->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
ui.label_imgA->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
}
if (m_nImageNum == 4) {
ui.label_img5->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
ui.label_imgA->setPixmap(QPixmap::fromImage(image).scaled(560, 420));
}
vector_images->append(image);
m_nImageNum++;
if (m_nImageNum == 5) { m_nImageNum = 0; }
}); //每次有图像都走这个槽函数,QVector<QImage>中存满5次就清零
在后面需要遍历的时候使用
QVector<QImage>::iterator iter;
for (iter = vector_images.begin(); iter != vector_images.end(); iter++)
{
qDebug() << *iter;
if(vector_images->size() == 5){
ui.label_img1->setPixmap(QPixmap::fromImage(vector_images->at(0)).scaled(560, 420));
ui.label_img2->setPixmap(QPixmap::fromImage(vector_images->at(1)).scaled(560, 420));
ui.label_img3->setPixmap(QPixmap::fromImage(vector_images->at(2)).scaled(560, 420));
ui.label_img4->setPixmap(QPixmap::fromImage(vector_images->at(3)).scaled(560, 420));
ui.label_img5->setPixmap(QPixmap::fromImage(vector_images->at(4)).scaled(560, 420));
}
}
界面却显示同一张图像
然后查找各种资料,发现问题了:
解决办法:
将 vector_images->append(image);时修改为:
image.detach();
vector_images->append(image);
另外使用QVector<QImage>类型时需要先进行注册
qRegisterMetaType<QVector<QImage>>("QVector<QImage>");//注册QVector<QImage>类型
原因分析:
QT中有一个Implicit Sharing的概念,叫做隐式共享,许多QT中许多C++类用隐式数据共享来减少copy带来的资源占用问题。当作为参数传递时,隐式数据共享是安全和高效的,因为仅仅是指向数据的指针进行传递,而数据只在有函数对它进行改写是才进行复制。(copy on write)
QImage只做了浅拷贝,并不是我们想要的深拷贝。
所以需要将QImage进行深拷贝:image.detach();
参考链接:
https://blog.csdn.net/cc321123123/article/details/41701611:QT5 QList<QImage> 中后面数据将前面数据覆盖问题的解决方案