`
duyouhua1214
  • 浏览: 236219 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

QT工程中使用图片的三种方法

    博客分类:
  • 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”)进行注册创建分配内存即可!  而不使用时候则调用反注册函数!!

这种方式算是动态加载,会少占用内存。但是如果图片过多的话,什么时候需要加载,什么时候需要去掉,这些逻辑就需要十分注意了。

来源:http://sue602.blog.163.com/blog/static/314953072010101723453987/

分享到:
评论

相关推荐

    QT中显示bmp图片

    通过这种方式,你可以实现在QT中使用SDL2来显示BMP图片。虽然这个方法稍微复杂一些,但它允许你在QT的图形用户界面中利用SDL2的图形处理能力,特别是当你需要处理非QT原生支持的图像格式或者有特殊渲染需求时。

    Qt4中学习使用QtCharts绘图五:绘制折线图

    在本文中,我们将深入探讨如何在Qt4中利用QtCharts模块来绘制折线图。QtCharts是Qt的一个扩展库,提供了丰富的图表类型,包括折线图、柱状图、饼图等,使得开发者能够轻松地在应用程序中展示数据。虽然Qt4已经有些...

    VC工程转Qt工程文件的工具

    总的来说,"VC工程转Qt工程文件的工具"为开发者提供了一种便捷的方式来迁移已有的VC项目到Qt平台,降低了跨平台开发的门槛。然而,这种自动化转换并不能完全替代手动调整,对于复杂的项目,开发者仍然需要具备一定的...

    QGis+qt实现缩略图工程源码,没有运行环境,需自己配置运行环境

    QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码...

    QT给图片加水印(pro工程+代码)

    QT给图片加水印是一种常见的图像处理操作,用于在图片上添加标识或版权信息,防止未经授权的使用。本文将深入探讨如何使用Qt框架实现这一功能,包括必要的编程知识和步骤。 首先,Qt是一个跨平台的应用程序开发框架...

    RabbitMQ客户端Qt工程文件

    通过深入研究这个RabbitMQ客户端Qt工程,开发者不仅可以学习到如何在Qt环境中使用RabbitMQ,还可以借鉴其工程组织和最佳实践,为自己的项目开发提供参考。无论是对RabbitMQ还是Qt有一定基础的开发者,都可以从这个...

    RabbitMQ客户端Qt项目工程

    通过这个RabbitMQ客户端工程,开发者不仅可以学习到如何使用Qt和QAMQP库与RabbitMQ进行通信,还能了解如何设计和组织一个完整的Qt项目,这对于构建其他基于Qt的消息传递应用具有很高的参考价值。此外,由于工程已经...

    Qt6绘制折现图完整工程,折线图支持缩放等操作。

    在本文中,我们将深入探讨如何使用Qt6框架来创建一个具备折线图绘制及缩放功能的完整工程。Qt是一个跨平台的应用程序开发框架,广泛应用于GUI编程,同时也支持非图形化应用程序。Qt6作为其最新版本,引入了更多的...

    CMake 生成Qt工程文件(vs2013 or vs2015)

    为了在CMake中使用Qt,你需要首先使用`find_package(Qt5 REQUIRED COMPONENTS Widgets Core)`命令找到Qt库,并指定需要使用的模块(如Widgets和Core)。接着,使用`qt5_wrap_cpp()`或`qt5_add_resources()`处理Qt的...

    C++ QT 显示图片

    通过运行此项目,你可以直观地看到如何在实际应用中使用上述方法。 5. **优化与注意事项** - 为了提高性能,可以考虑使用异步加载网络图片,避免阻塞UI线程。 - 对于大图片,可以使用QPixmap的`scaled()`函数进行...

    live555 Qt工程

    【标题】"live555 Qt工程"是一个专为Linux平台设计的开源项目,它将流行的多媒体框架live555与图形用户界面库Qt相结合,为开发者提供了一种在Qt Creator环境中开发实时音视频流应用的便利途径。live555是著名的开源...

    qt初学者的qt工程

    在本资料包中,`qt_PRO`可能是包含Qt工程配置的文件,它指导构建过程,确保所有源代码、头文件和资源文件正确地组织和编译。 学习Qt,除了理解这些基本概念,还需要熟悉Qt Creator集成开发环境的使用,掌握各种控件...

    qt使用boost工程模板

    在Qt项目中使用Boost可以让你访问这些强大的工具,提高代码的可读性、效率和可维护性。 在开始一个使用Boost的Qt工程之前,你需要确保已经安装了Qt和Boost。安装Boost时,通常需要编译源码并配置环境变量,以使...

    Qt使用Poppler-qt5操作PDF文件

    在本文中,我们将深入探讨如何在Qt环境中使用Poppler-qt5库来处理PDF文件。Poppler是一个开源的PDF文档解析库,而Poppler-qt5是它的Qt接口,允许我们在Qt应用程序中方便地集成PDF阅读和编辑功能。Qt是一个跨平台的...

    Qt创建工程小结

    2. **在头文件中添加网络库**:为了能够在源代码中使用网络相关的API,还需要在源文件的头部添加以下代码: ```cpp #include #include #include ``` 这些头文件提供了处理HTTP请求和响应的基本类。 通过...

    SSD源码的QT工程

    QT工程则是为软件开发提供的一种图形用户界面(GUI)开发框架,它具有跨平台、丰富的库支持和直观的API,使得构建用户友好的应用程序变得更加容易。 在SSD源码阅读过程中,创建一个QT工程可以为开发者带来诸多便利...

    qt http下载工程

    QT HTTP下载工程是一种基于Qt库实现的HTTP协议下载管理器,尤其在QT5.7版本和Visual Studio 2013环境下进行了优化和适配。这个项目的核心目标是提供一个功能完善的下载工具,具备断点续传的能力,使得用户可以在网络...

    QT工程中的文件介绍

    在QT工程中,文件的管理和配置是项目构建的关键部分,其中`.pro`文件扮演着核心角色。`.pro`文件是QT项目的基础,它定义了项目的结构、编译选项以及依赖关系。通过`qmake`命令,这个文件会被解析并生成对应的...

    Hello-QT.rar_QT_qt 工程_qt程序

    4. **资源管理**:如果工程包含资源文件,可以在Qt Creator中进行管理,如图片、图标等,以便于在程序中使用。 5. **编译与运行**:在Qt Creator中,开发者可以直接编译和运行程序,查看结果。 【学习资源】 对于...

    opencv+tesseract+QT实践篇.docx

    然后,在实现文件中使用 Tesseract 识别方法将图像转换为文本。最后,将识别结果显示在标签中。 六、运行测试 运行程序,测试是否可以成功识别文本。同时,测试是否可以成功显示识别结果。 知识点: 1. OpenCV ...

Global site tag (gtag.js) - Google Analytics