QImage和QPixmap都是可以用于显示图片的,但是有一些不同。比如说QPixmap是与硬件关联的,而QImage是硬件独立的。硬件关联的一个特点是不可以跨线程访问。就是说QImage可以单独的用线程加载,然后在另一个线程展示,而QPixmap不可以。
对这个硬件关联我没有这个概念,体会不深,但是在做图片多线程加载的时候,使用QPixmap吃了很多苦头。
1、QPixmap不可以使用在子线程中加载图片。
准确的说,使用在子线程加载图片也是可以的,但是调试的时候会报“segmentation fault”(段错误),原因可能就是刚才说的硬件关联等问题。
不管是使用引用初始化,还是用new,都是徒劳的。
如果忽略调试时的问题,正常跑起来也是没问题的。
2、用QImage代替QPixmap
历经尝试n多种方法,才发现用QImage代替QPixmap在线程中加载,可以解决上述“segmentation fault”。从线程中加载了图片之后,把QImage引用通过信号传递给主线程。
QImage image;
image.load(path);
QThread::msleep(500);
emit onImgLoadSignal(image);
3、如果QImage用指针将会删除不掉
一个想法,QImage想用指针来做,这样在接收到了之后,使用结束了,可以删除掉。但是实际上删除不掉:
(之所以想要手动删除,看第四点)
QPixmap pixmap = QPixmap::fromImage(*