目录
前言
利用qt5在linux板上进行图片显示,当我想利用开发板上文件系统内存出地图片做显示时出现如下问题,本文用于记录为解决此问题所做的尝试及结果。
qpixmap::scaled: pixmap is a null pixmap
一、图片路径的查找
根据在网上找到的资料,出现上述错误的最大可能在于载入图片的路径错误,因此修复错误的主要目标在于找到正确的图片路径。qt在进行文件查找时可以通过绝对路径,也可以通过相对路径,这两者的区别不再细说。需要注意的是qt中显示路径是使用“/”,与windows是不同的。
为了确认程序的运行路径,我找到了以下两个函数来查找路径:(以下来自博客:qt中获取当前目录_qt获取当前路径-CSDN博客)
QDir::currentPath() //执行命令时所在的目录,如我在/目录下在命令行执行/usr/local/ls命令,这时候的目录就是/目录
QCoreApplication::applicationDirPath() //可执行程序所在目录
qDebug()<<"currentPath"<<QDir::currentPath();
qDebug()<<"programePath"<<QCoreApplication::applicationDirPath();
可执行程序所在目录好理解,执行命令时所在的目录就不是那么好理解了,这里先看下我得到的结果:
currentPath "/sys/kernel/config/usb_gadget/adb_demo"
programePath "/tmp"
programePath 显示的路径“/tmp”为开发板内可执行程序所在的路径,这一点通过ls命令可以清楚查询到,而currentPath显示的路径一开始我并不理解,后来通过网上资料才了解到,这显示的是父进程所在的路径:我是通过adb将可执行程序写入“/tmp” 文件夹并启动qt程序的,因此currentPath显示的是启动程序时的路径,即可执行程序的父进程所在的路径。通过top等命令可查看其父子关系。
二、不同路径下的图片显示
1.添加资源文件显示
这种方式是直接将图片资源加入到工程内部编译,因此它的引用也最为简单,虽然这种方式与本文实现的目的不同,但也简单写下。
QImage im;
//图片路径可以通过右击工程的图片获取
im.load(":/1.jpg");
//或者(:不可省略)
//im.load(":./1.jpg");
QPixmap pixmap = QPixmap::fromImage(im);
QLabel *lab = new QLabel(this);
lab->setGeometry(0,0,200,200);
lab->setPixmap(pixmap);
2.绝对路径显示
为了方便,我的图片资源也被放在开发板的tmp目录下的imgs文件夹下,因此我的绝对路径显示图片代码如下:
QImage im;
//图片绝对路径
im.load("/tmp/imgs/1.jpg");
QPixmap pixmap = QPixmap::fromImage(im);
QLabel *lab = new QLabel(this);
lab->setGeometry(0,0,200,200);
lab->setPixmap(pixmap);
3.相对路径显示
通过绝对路径的图片显示,相对路径的显示似乎更为简单:
im.load("./imgs/1.jpg");
然而在测试中,这并不是一个正确答案,正确答案如下:
QImage im;
//图片相对路径
im.load("../../../../../tmp/imgs/1.jpg");
QPixmap pixmap = QPixmap::fromImage(im);
QLabel *lab = new QLabel(this);
lab->setGeometry(0,0,200,200);
lab->setPixmap(pixmap);
是的,qt程序中的相对路径中似乎并不是以可执行程序文件所在目录作为当前目录,而是以currentPath 程序启动目录作为当前目录。为了验证这一猜测,将路径修改为“./imgs/1.jpg",并使用两种不同的启动方式启动程序,对比其结果。
通过adb启动,其结果为:
通过串口在tmp目录下执行./untitled 启动:
程序正常执行,currentPath 路径也发生了改变,可见qt程序中的相对路径确实是以程序启动目录作为当前目录,因此当我们需要使用文件路径时还是尽可能使用绝对路径比较保险,毕竟谁知道程序会在哪里启动呢。
2.图像色深问题
在查找问题解决方法时遇到有博主说图片的色深不够也会引发同样的问题,但我在测试过程中并没有出现此问题,无论24位还是32位色深图片显示都没有报此错误,或许是被修复了,仅在此做记录。
参见博客:QT使用QLabel控件显示图片,报错:QPixmap::scaled: Pixmap is a null pixmap-CSDN博客
总结
由qpixmap::scaled: pixmap is a null pixmap问题引发的对图片显示路径的测试与讨论。
参考文献
QT使用QLabel控件显示图片,报错:QPixmap::scaled: Pixmap is a null pixmap-CSDN博客