‘壹’ qrc_images.cpp是什么是qt库自带的文件吗
图片是一种资源,而在Qt中,对于资源的使用是有其独特的方式的!
①:一般来说:资源在内存中是用资源对象树来表示的,该树在程序启动时创建。
②:而对于资源而言:我们都是需要先将其加入到这棵树中才能加载到内存中并被程序使用!!
③:而将一个图片资源放到程序的资源对象树中是用函数QResource::registerResource()来实现的。亦即:要将资源向这颗资源对象树进行注册,这样才对在系统中new创建这个资“叶子”。
Qt中经常会使用一些图片作为程序的界面,经常用的有三种方法,这里借鉴了小窦朋友的方法总结
1、在程序运行时候加载图片,
也是最简单的方法
image=new QImage("1.png");
这种方法在程序运行时候再去加载图片,需要在程序的运行目录下添加事先放置好图片,这样做的优点是程序运行时候不需要的图片不加载,节省了内存,但是读取速度慢。
2、将图片编译进工程中,
这样在程序发布时候不需要在目录下放置图片,主要通过的是.qrc文件,例如添加image.qrc文件,这个文件会在编译时候生成qrc_image.cpp文件,,我们可以自己看下这个生成的cpp文件,发现其中就是主要有三个static const数组。
qt_resource_data[]
qt_resource_name[]
qt_resource_struct[]
这其中qt_resource_data[]中存放的就是图片的二进制数据。而后边的两个数组我们猜测是做了一个图片名字到上边数据的映射,方便系统找到data中的二进制数据。
至于内部作用机制,有的资料上说是:当使用qrc资源文件时:系统会自动将所有的图片资源都向程序的资源对象树进行注册,并且当程序结束运行时再进行反注册。这也正好解释了为什么此种方法下图片资源会一直占用内存的原因。
使用这种方法时:由于图片资源一直在内存中,避免了I/O操作,从而加快了读取速度。但是却是以消耗内存为代价的
方法如下:
在qrc文件中加上下面的代码。
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>1.png</file>
<file>2.ico</file>
</qresource>
</RCC>
然后再.pro文件中添加下面的代码
RESOURCES = res.qrc
在程序中使用图片文件时候,通过
:1.png的方法来使用
例如
image=new QImage(":1.png");
3、手动进行注册
第二种方法相当于静态加载,但很多情况下我们更希望是动态加载,亦即:用到哪个资源才将该资源加载进来,而不用的则不加载。
上边第二种方法之所以显示出静态加载的特性,这是由于系统一次性自动把所有图片资源都进行了注册,并且在程序运行过程中一直没有进行反注册才导致的。 如果我们可以自行决定:什么时候对那一部分图片资源进行注册?什么时候对哪一部分图片资源进行反注册。则显然我们可以手动控制整个资源在内存中的生存周期!!
这种方法的主要步骤为:
①:生成外部二进制资源文件。
②:在需要时将该资源向程序的资源对象树进行注册并使用。
③:在不需要时进行反注册。
步骤①主要是用了Qt自带的一个工具:rcc.exe (处于bin文件夹中)。这是Qt的一个资源编译器,其编译对象是qrc文件,而生成rcc二进制资源文件。
那我们可以用它来执行命令 rcc -binary name.qrc -o name.rcc 来把qrc资源文件转成rcc二进制资源文件。
而后在程序内部:当需要使用某一图片资源时:则直接调用
QResource::registerResource(“name.rcc”)进行注册创建分配内存即可! 而不使用时候则调用反注册函数!!
这种方式算是动态加载,会少占用内存。但是如果图片过多的话,什么时候需要加载,什么时候需要去掉,这些逻辑就需要十分注意了。
‘贰’ python怎么使用qtdesigner设计的ui
软硬件环境
OS X EI Capitan
Python 3.5.1
PyQt 5.5.1
PyCharm 5.0.1
前言
在PyQt5系列教程的第一篇h50218157,我们已经搭建好了开发环境,今天,我们就用Python开发第一个Qt GUI程序,让大家感受下Qt开发的魅力,熟悉下Qt开发GUI程序的一般流程。
制作程序UI界面,一般会有2种方法,利用UI制作工具和纯代码编写,像移动开发中的Android和iOS都是这样,在PyQt5中,我们也有这么2种方式。
QtDesigner工具简介
QtDesigner是专门用来制作Qt程序UI界面的工具,它使用起来非常简单,只要通过拖拽和点击就可以完成复杂的界面设计,而且还可以随时预览查看效果图。
其中,区域1是UI界面制作导向,QtDesigner为我们提供了一些常用模块,非常方便;区域2是UI控件列表;区域3是控件属性列表;区域4是Action Editor编辑列表;区域5信号和槽的编辑列列表;区域6是资源处理窗口。
第一个PyQt5程序
说了这么多,还不如来动手实践一下。
这个是我们第一个PyQt5项目的界面效果图,需要实现的是当点击界面上的按钮时,弹出一个提示框,提示框内显示一串文字。
好了,目标定好了,马上开始去实现它。
QtDesigner设计UI
创建一个基于Main Window模块的UI文件,取名叫firstPyQt5.ui。从Widget Box中找到(也可以)Push Button,将它拖拽到工作空间里,调整位置,在Button上输入文字,调整字体及大小,这些都可以在Property Editor里操作。按钮点击弹框的操作会牵出Qt里非常重要的一对概念,即信号和槽(signal and slot),关于这个我打算再开一篇博文细讲。现在你只需要知道slot就是一个函数,如果一个signal和一个slot绑定以后,那么signal被触发,slot就会被执行。
那么问题来了,怎么在QtDesigner里绑定signal和slot呢?打开菜单栏里的Edit—>Edit Signals/Slots,然后光标移到按钮上点击拖拽,这时会弹出一个编辑框
因为是点击,所以signal选择clicked(),slot函数现在还没有,我们就点击Edit新建一个,叫firstPyQt5_button_click()
为了演示一下资源文件的使用,这里导入两张图片,一张给主窗口,另一张给帮助菜单项里的Action。
在QtDesigner引用资源文件之前,需要先准备一个qrc文件,它跟xml文件比较类似,用来制定资源文件的路径
接下来就可以在QtDesigner的Resource Browser里倒入qrc文件,这样qrc文件中描述的资源就可以使用了
将firstPyQt5.ui转换成python代码
非常简单,通过Qt提供的命令行工具pyuic5就可以轻松实现
创建PyCharm工程
新建一个新的python文件main.py,代码如下
接下修改下firstPyQt5.py文件,主要是去实现slot函数,因为之前在QtDesigner里没有实现,让它弹出一个消息框
最后运行下工程
这里一般将ui文件单独存成一个文件,便于更新。
‘叁’ python怎么输入图片
python导入图片的方法:
一、直接从源图片中导入(图片位于images文件夹内)self.label1=QLabel(self)
self.label1.setPixmap(QPixmap(r"images/head.jpg"))
layout.addWidget(self.label1)
#或者 layout.addWidget(QLabel(self, pixmap=QPixmap("images/head.jpg")))
二、利用qrc资源导入
1、先写qrc文件
images/head.jpg
images/body.jpg
2、将qrc文件转化成py文件
转化命令为:pyrcc5 res.qrc -o res_rc.py
3、导入res_rc.py:import res_rc
4、layout.addWidget(QLabel(self,pixmap=QPixmap(":/images/head.jpg")))
注意需要添加:/符号作为前缀。