Qt-qrc机制
Qt导入照片等资源的三种方式
绝对路径
c++1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QIcon icon("D:/document/code/QT/LEARNING/QWidget_7/143894.jpg");//直接在栈上创建,而不是在堆上
//之前推荐在堆上创建,主要是因为要确保当前空间的生命周期是足够的,要通过Qt对象树来释放对象。
//QIcon自身是一个比较小的对象,创建出来了之后,就是要设置到某个QWidget里面,QIcon对象本身是否释放,都不影响最后的显示
//另一方面,QIcon不支持对象树
this->setWindowIcon(icon);
//setWindoewIcon和setWindowTitle一样,也是顶层窗口设置才有效
}相对路径
c++1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QIcon icon("../QWidget_7/143894.jpg");
//通过绝对路径的方式进行引用,是不科学的
//因为写的程序最后是要发布到用户的电脑上的,无法确保,开发机上图片的路径和用户电脑上的路径完全一致
//因此,相比于使用绝对路径的方式,使用相对路径是更好的
//另外还需要注意,此处使用的./是可执行程序的路径,并不是项目工程的路径,因为程序运行时的工作路径,是可执行程序所在路径,并非工程所在的路径
this->setWindowIcon(icon);
//setWindoewIcon和setWindowTitle一样,也是顶层窗口设置才有效
}qrc机制
qrc机制
Qt引入qrc机制,从根本上解决两个问题:
- 图片所在路径不一定在用户机上也存在 (绝对路径的缺点)
- 图片可能会在用户机上丢失 (相对路径的缺点)
原理:给Qt项目引入了一个额外的xml文件(后缀为.qrc),在这个xml中将要使用的图片资源导入进来,并且在xml中进行记录。Qt在编译项目的时候,会根据qrc中的图片信息,找到图片中的内容,提取出里面的二进制数据,将二进制数据转化为C++代码,最终编译到exe中。
qrc的缺点:无法导入太大的资源。
qrc的用法
1.新建项目
选择Qt -> Qt Resource File,创建名称之后一致next即可。此处取名”resource“。
创建完成后可以看到左侧项目列表中多了一个Resources/resource.qrc
双击之后进入界面
2.新建前缀(Add Prefix)
前缀可以理解为Qt创建的一个虚拟目录
自定义一下前缀的名称,然后在qrc文本编辑下就可以看到这个新建的虚拟目录了
3.导入文件(Add Files)
导入文件,即将文件放入刚创建好的前缀中。需要注意的是,文件必须来自于qrc文件同级目录下或同级目录下的子目录中,即必须先将需要导入的文件放入工程目录中才行。
点击Qt编辑区(Qt Editor)的/test
,选择Add Files
,选中要导入的文件
导入完成后,可以看到/test新增了刚导入的文件,选择该文件,可以设置别名,后去就可以直接用别名调用此文件了,十分方便
保存一下qrc文件,可以看到左侧项目栏中增加了内容
此时qrc文件已经变成了列表,双击没有办法对qrc进行编辑了。右击qrc文件,可以执行Add Prefix等操作,右击前缀,可以执行添加文件等操作。
右击qrc文件,还可以选择在编辑区中打开(Open in Editor),此时又可以通过跟上面一样的操作来编辑qrc文件了。
4.引用文件
在引用文件的时候,语法与绝对路径,相对路径一样,只是前面要加上冒号”:”
1 | QIcon icon(":/test/Asuka");//使用qrc的时候,格式为": + 虚拟路径" |
补充:
前缀名可以加”/“可以不加,因为qrc会自动补全
前缀名也可以为空,同样,qrc也会自动补全”/“
引用文件的时候,前缀为空,就直接不用写了
探究qrc
进入可执行程序目录,会看到多了一个文件:qrc_resource.cpp
qrc中导入文件资源,就会被转化成qrc_resource.cpp中的代码
当Qt项目进行编译的时候,该cpp文件就被一起编译到exe中了,当exe程序运行的时候,上述图片的数据也就被加载到内存中了