qt-C++笔记之QLabel加载图片

qt-C++笔记之QLabel加载图片

—— 2024-04-06 夜


code review!

文章目录

  • qt-C++笔记之QLabel加载图片
    • 0.文件结构
    • 1.方法一:把图片放在项目路径下,在 .pro 文件中使用 DISTFILES添加图片文件
      • 1.1.运行
      • 1.2.qt_test.pro
      • 1.3.main.cpp
    • 2.方法二:不在 .pro 文件中使用 DISTFILES添加图片文件,直接在main.cpp中指定图片路径
      • 2.1.main.cpp
      • 2.2.附加解释
    • 3.方法三:上述方法中直接使用图片去构造QPixmap对象,若使用 QPixmap 的 load() 方法来加载图片
      • 3.1.运行
      • 3.2.main.cpp
      • 3.2.附加解释
    • 4.上述代码中只有QLabel和QPixmap,若结合QImage来显示图片
      • 4.1.运行
      • 4.2.main.cpp
      • 4.3.附加解释
      • 4.4.代码流程图
      • 4.5.`QImage`和`QPixmap`表格对比
    • 5.视频流解码的图像数据需要使用的函数:QPixmap::fromImage()
    • 6.Qt在加载的图片上的指定位置画矩形框:创建一个 QPainter 实例并在 QPixmap 上绘制矩形
      • 6.1.运行
      • 6.2.main.cpp
    • 7.`setScaledContents`和`scaled`方法表格对比

0.文件结构

在这里插入图片描述

1.方法一:把图片放在项目路径下,在 .pro 文件中使用 DISTFILES添加图片文件

1.1.运行

在这里插入图片描述

1.2.qt_test.pro

QT += widgets core
TARGET = qt_test
TEMPLATE = app
SOURCES += main.cppDISTFILES += \123.jpg

1.3.main.cpp

#include <QApplication>
#include <QLabel>
#include <QPixmap>int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel label;QPixmap pixmap("123.jpg"); label.setPixmap(pixmap);label.show();return app.exec();
}

2.方法二:不在 .pro 文件中使用 DISTFILES添加图片文件,直接在main.cpp中指定图片路径

2.1.main.cpp

#include <QApplication>
#include <QLabel>
#include <QPixmap>int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel label;QPixmap pixmap("/home/user/qt_cpp_test/qt_test/123.jpg"); // 替换为图片文件路径label.setPixmap(pixmap);label.show();return app.exec();
}

2.2.附加解释

  1. QPixmap是用于处理图像的类,它可以加载和显示许多不同格式的图片。
  2. 使用QPixmap的构造函数来加载一个图片文件。
  3. 使用QLabelsetPixmap方法将图片设置到标签上。
  4. 最后调用show方法来显示带有图片的标签。

确保替换"/path/to/image.jpg"为实际图片文件的路径。如果图片文件路径不正确或文件不存在,QPixmap对象将是一个空对象,并且QLabel不会显示任何图片。

此外,如果图片大小超过QLabel的大小,那么图片将会被裁剪。如果想让图片自适应QLabel的大小,可以使用QPixmap::scaled方法来调整图片尺寸。例如:

label.setPixmap(pixmap.scaled(label.size(), Qt::KeepAspectRatio));

这会将图片缩放到QLabel的大小,同时保持图片的宽高比。Qt::KeepAspectRatio是一个枚举值,指示应保持原始图像的宽高比。

3.方法三:上述方法中直接使用图片去构造QPixmap对象,若使用 QPixmap 的 load() 方法来加载图片

3.1.运行

在这里插入图片描述

3.2.main.cpp

#include <QApplication>
#include <QLabel>
#include <QPixmap>int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel label;QPixmap pixmap;// 尝试加载图片,替换为图片文件路径bool loaded = pixmap.load("123.jpg");if (loaded) {// 如果图片加载成功,设置到QLabellabel.setPixmap(pixmap);} else {// 如果加载失败,可以设置一个错误消息label.setText("图片加载失败!");}label.show();return app.exec();
}

3.2.附加解释

使用 QPixmapload() 方法来加载图片,可以先创建一个 QPixmap 对象,然后调用 load() 方法来加载图片文件。这种方式可以方便地检查图片是否成功加载,因为 load() 方法会返回一个布尔值,指示操作是否成功。

在这段代码中:

  • 创建了一个 QPixmap 对象。
  • 调用 load() 方法尝试加载指定路径下的图片文件。
  • load() 方法返回 true 如果图片成功加载,否则返回 false
  • 如果图片加载成功,则使用 setPixmap() 方法将其设置到 QLabel 上。
  • 如果图片加载失败,则 QLabel 显示一条错误消息。

想处理加载失败的情况,可以在 else 块中添加适当的代码来通知用户或记录错误。

4.上述代码中只有QLabel和QPixmap,若结合QImage来显示图片

4.1.运行

在这里插入图片描述

4.2.main.cpp

#include <QApplication>
#include <QLabel>
#include <QPixmap>
#include <QImage>int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel label;QImage image;// 尝试加载图片,替换为图片文件路径bool loaded = image.load("/path/to/image.jpg");if (loaded) {// 如果图片加载成功,转换为QPixmap并设置到QLabelQPixmap pixmap = QPixmap::fromImage(image);label.setPixmap(pixmap);} else {// 如果加载失败,可以设置一个错误消息label.setText("图片加载失败!");}label.show();return app.exec();
}

4.3.附加解释

QImage 是Qt中另一个处理图像的类。与 QPixmap 相比,QImage 更适合图像的离屏处理,例如图像的像素级操作。而 QPixmap 更适合屏幕显示和绘制。

如果想在上述例子中使用 QImage,可以首先加载图像到一个 QImage 对象中,然后将其转换为 QPixmap 来为 QLabel 设置。

在这段代码中:

  • 创建了一个 QImage 对象。
  • 使用 load() 方法加载图片文件到 QImage 对象中。
  • 如果图片成功加载,使用静态方法 QPixmap::fromImage()QImage 转换为 QPixmap
  • 然后使用 setPixmap() 方法将 QPixmap 设置到 QLabel 上。
  • 如果图片加载失败,则 QLabel 显示错误消息。

这种方法允许在将图像显示在 QLabel 之前,利用 QImage 提供的功能对图像进行处理。例如,可以修改图像的大小,应用滤镜,调整颜色等。记住,所有这些操作都应该在将 QImage 转换为 QPixmap 之前完成。

4.4.代码流程图

+----------------+         +-----------------------+         +----------------+         +-----------------+         +-----------------------+         +------------------+
|     Start      |         |  创建 QApplication    |         |   创建 QLabel   |         |  创建 QImage    |         | 加载图片到 QImage     |         |   加载成功?       |
+----------------+         +-----------------------+         +----------------+         +-----------------+         +-----------------------+         +--------+---------+|                              |                              |                              |                              |                    Yes / No|                              |                              |                              |                              |                  /          \v                              v                              v                              v                              v                /            \
+----------------+         +-----------------------+         +----------------+         +-----------------+         +-----------------------+      +-------v-------+   +-----------------+
| 创建 QApplication |  --->  |   创建 QLabel         |  --->  |  创建 QImage     |  --->  | 加载图片到 QImage   |  --->  |  image.load(...)       |  --->  |  从 QImage      |   | 设置 QLabel 文本 |
+----------------+         +-----------------------+         +----------------+         +-----------------+         +-----------------------+      |  创建 QPixmap   |   | "图片加载失败!" ||                              |                              |                              |                              |                  +-----------------+|                              |                              |                              |                              |                    /v                              v                              v                              v                              v                  /
+----------------+         +-----------------------+         +----------------+         +-----------------+         +-----------------------+        /
|  显示 QLabel     |  <---  |  设置 QLabel 的       |  <---  |  设置 QLabel 的       |  <---  |  加载图片到 QLabel    |  <------------------------+       /
+----------------+         |  QPixmap               |         |  QPixmap               |         |  image.load(...)       |                                   /|                              +-----------------------+         +----------------+         +-----------------------+                                  /|                                                                                                                                                /v                                                                                                                                              /
+----------------+                                                                                                                                     /
| 进入事件循环     |                                                                                                                                /
| app.exec()     |                                                                                                                               /
+----------------+                                                                                                                              /|                                                                                                                                     /v                                                                                                                                    /
+----------------+                                                                                                                           /
|      End       |                                                                                                                          /
+----------------+-------------------------------------------------------------------------------------------------------------------------+

图片版
在这里插入图片描述

4.5.QImageQPixmap表格对比

在Qt框架中,QImageQPixmap 都用于处理图像,但它们各自有不同的优化点和用途。

特性 / 用途QImageQPixmap
基本描述用于图像的处理和转换;更像是图像数据的容器。用于在屏幕上显示图像;优化了绘制速度。
颜色深度支持多种颜色格式和颜色深度。通常与显示系统的颜色深度匹配。
性能对图像进行操作(如旋转、缩放)时性能较低。绘制到屏幕上时性能较高,因为它是为显示优化的。
硬件加速通常不使用硬件加速。使用硬件加速绘制到屏幕,因此在显示时更快。
图像处理提供像素级访问,适用于图像的处理和分析。不方便直接操作像素。
文件交互读取和写入图像文件时常用,可以直接从文件加载和保存。一般不直接用于读写文件,通常通过QImage加载后转换为QPixmap进行显示。
内存使用可以更高效地使用内存,特别是使用非本机格式时。内存使用可能更高,因为它存储的是屏幕格式的数据。
透明度处理支持alpha通道,可以处理图像的透明度。同样支持alpha通道。
网络传输用于网络传输或图像处理时更加合适,因为它能够以不同的格式存储和处理图像数据。通常不用于网络传输。
线程安全可以在非GUI线程中创建和修改。必须在GUI线程中创建,因为它涉及到与显示硬件的交互。
使用场景示例- 创建图像编辑应用时
- 对图像进行分析处理
- 在后台线程处理图像
- 在窗口或者控件中快速显示图像
- 当图像不需要在多个颜色空间中变换时使用

在实际开发中,选择 QImage 还是 QPixmap 取决于具体需求。如果需要处理图像数据(如过滤、变换等),QImage 是更好的选择。如果主要需求是在Qt的窗口系统中快速显示图像,QPixmap 是更合适的。有时可能需要在两者之间转换,例如,可能会从文件中加载一个图像到 QImage 中进行处理,然后将其转换为 QPixmap 以快速显示在屏幕上。

5.视频流解码的图像数据需要使用的函数:QPixmap::fromImage()

如果正在处理视频流,并且有解码后的图像数据,通常会得到一个 QImage 或者一个原始的图像数据缓冲区。如果经有了一个 QImage 实例,可以使用 QPixmap::fromImage() 方法来将其转换为 QPixmap,从而能够在 QLabel 上显示它。

当从视频流中解码图像时,可能直接得到原始的帧数据,比如一个字节数组。在这种情况下,可以先创建一个 QImage 对象,然后使用该对象的构造函数或者 loadFromData 方法来从原始数据创建图像。一旦有了一个 QImage 对象,就可以像之前一样将其转换为 QPixmap 并将其显示在 QLabel 上。

以下是一个简化的例子,说明如何从视频流中的原始数据创建 QImage 并将其转换为 QPixmap

#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QPixmap>// 假设这是从视频解码得到的原始图像数据
const uchar *videoFrameData = ...; // 视频帧的原始数据指针
int videoFrameWidth = ...; // 视频帧的宽度
int videoFrameHeight = ...; // 视频帧的高度
QImage::Format format = ...; // 视频帧数据的格式int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel label;// 从原始数据创建QImageQImage image(videoFrameData, videoFrameWidth, videoFrameHeight, format);// 将QImage转换为QPixmapQPixmap pixmap = QPixmap::fromImage(image);// 设置QLabel以显示QPixmaplabel.setPixmap(pixmap);label.show();return app.exec();
}

在这段代码中:

  • videoFrameData 是一个指向视频帧原始数据的指针。
  • videoFrameWidthvideoFrameHeight 分别是视频帧的宽度和高度。
  • format 是一个 QImage::Format 枚举值,指定了原始数据的格式。

QImage 的构造函数接受这些参数来创建图像对象。然后,可以使用 QPixmap::fromImage() 方法将 QImage 转换为 QPixmap,接着将其设置到 QLabel 上以供显示。

请注意,确保原始数据在 QImage 存在的整个生命周期内都是有效的,除非在创建 QImage 时使用了深拷贝。此外,确保数据的格式与 QImage 支持的格式相匹配。如果格式不匹配,图像可能无法正确显示。

6.Qt在加载的图片上的指定位置画矩形框:创建一个 QPainter 实例并在 QPixmap 上绘制矩形

6.1.运行

在这里插入图片描述

6.2.main.cpp

#include <QApplication>
#include <QLabel>
#include <QPixmap>
#include <QPainter>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 加载图片QPixmap pixmap("123.jpg"); // 替换为你的图片文件路径// 创建 QPainter 绘制在 QPixmap 上QPainter painter(&pixmap);painter.setPen(QPen(Qt::red, 3)); // 设置画笔为红色,线宽为3painter.drawRect(30, 40, 100, 100); // 在(10,10)位置绘制一个100x100的矩形框painter.end(); // 结束绘画// 将绘制好的 QPixmap 设置给 QLabelQLabel label;label.setPixmap(pixmap);label.show();return app.exec();
}

7.setScaledContentsscaled方法表格对比

在Qt框架中,setScaledContentsQWidget 的一个属性,通常用于 QLabel 或其他控件中,以指定是否应该缩放控件的内容以填充控件的大小。而 scaled 方法是 QPixmapQImage 类中的一个函数,用于创建原始图像的缩放版本。

特性 / 用途setScaledContentsscaled 方法
所属类QWidgetQPixmap / QImage
类型属性/函数函数
功能决定是否自动缩放控件内容以适应控件的大小。返回图像的缩放副本。
用法控件使用 setScaledContents(true) 来开启内容缩放。调用 scaled 方法并传入新的尺寸,可选地指定缩放模式和质量。
缩放时机控件大小变化时自动缩放内容。当你调用方法时手动创建一个缩放后的图像副本。
返回值无返回值,是一个设置属性的过程。返回缩放后的 QPixmap 或 QImage 副本。
性能对于频灁变化大小的控件可能会影响性能,因为每次大小改变都会触发重新缩放。缩放操作可能会消耗时间,特别是对于大图像和高质量缩放。
质量控制通常没有直接的质量控制选项,依赖于控件的实现。可以指定缩放模式,例如 Qt::SmoothTransformation 提高缩放质量。
适用场景- 当你希望 QLabel 或其他控件自动管理内容的缩放。
- 简单的UI元素缩放。
- 当你需要对图像进行一次性的缩放处理。
- 复杂的图像处理。
实现方式通过设置控件的属性来实现。通过调用方法并传递参数来实现。
内存管理不会创建新的图像副本,但频繁更新可能导致性能问题。创建一个新的图像副本,可能会增加程序的内存使用。
线程安全性属性设置通常需要在GUI线程中完成。QImagescaled 方法可以在非GUI线程中使用。
可扩展性适用于任何 QWidget 派生的控件,但不提供缩放逻辑的自定义。允许通过不同的参数来微调缩放的结果,更灵活。
例子myLabel->setScaledContents(true);QPixmap scaledPixmap = originalPixmap.scaled(newWidth, newHeight);

总结:

  • setScaledContents 是一个控件属性,用于自动调整内容大小以适应控件的尺寸变化。
  • scaledQPixmapQImage 对象的一个方法,用于生成指定大小的缩放副本,它允许更多的控制,如缩放模式和质量选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304355.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《深入Linux内核架构》第2章 进程管理和调度 (2)

目录 2.4 进程管理相关的系统调用 2.4.1 进程复制 2.4.2 内核线程 2.4.3 启动新程序 2.4.4 退出进程 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;订阅后续文章。 2.4 进程管理相关的系统调用 2.4.1 进程复制 1. _do_fork函数 fork vfork clone都最终调用_…

计算机网络 Telnet远程访问交换机和Console终端连接交换机

一、实验要求和内容 1、配置交换机进入特权模式密文密码为“abcd两位班内学号”&#xff0c;远程登陆密码为“123456” 2、验证PC0通过远程登陆到交换机上&#xff0c;看是否可以进去特权模式 二、实验步骤 1、将一台还没配置的新交换机&#xff0c;利用console线连接设备的…

数学建模-最优包衣厚度终点判别法-二(K-Means聚类)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是viperrrrrrr~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff…

OpenAI曾转录100万小时视频数据,训练GPT-4

4月7日&#xff0c;纽约时报在官网发布了一篇名为《科技巨头如何挖空心思&#xff0c;为AI收集数据》的技术文章。 纽约时报表示&#xff0c;OpenAI曾在2021年几乎消耗尽了互联网有用的文本数据源。为了缓解训练数据短缺的难题&#xff0c;便开发了知名开源语音识别模型Whispe…

Leetcode 394. 字符串解码

心路历程&#xff1a; 这道题看到括号直接想到栈&#xff0c;五分钟新题直接秒了&#xff0c;一开始以为需要两个栈分别存储数字和非数字&#xff0c;后来发现一个栈就够了&#xff0c;思路如图&#xff1a; 这道题考察的应该是队栈这两种数据结构的转换&#xff0c;因为每次…

C语言比较两个字符串是否相等是很容易的

一、概要 两个字符串char str1[n]和char str2[n] while循环&#xff0c;开始前i置为0&#xff0c;如果两个字符串都没有到末尾&#xff0c;且str1[i]str2[i]&#xff0c;则i&#xff0c;循环继续 循环结束之后&#xff0c;如果两个字符串都到了末尾(str1[i]\0 &&…

Java零基础入门-Java反射机制

一、概述 我们都听说过java有个反射机制&#xff0c;通过反射机制我们可以更深入的控制程序的运行过程。例如&#xff0c;在程序进入到运行期间&#xff0c;由用户输入一个类名&#xff0c;然后我们可以动态获取到该类拥有的所有类结构、属性名和方法&#xff0c;甚至还可以任意…

Vue3---基础1(认识,创建)

变化 相对于Vue2&#xff0c;Vue3的变化&#xff1a; 性能的提升 打包大小减少 41% 初次渲染快 55%&#xff0c;更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…

PHP 伪协议:使用 php://input 访问原始 POST 数据

文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议&#xff1f; php://input为什么需要 php://input&#xff1f;更灵活的数据处理减小性能压力 发送 POST 数据HackBarHackBar 插件的获取 $_POST打开 HackBar 插件通过 HackBar 插件发起 POST 请求 基操 enable_post_data_…

Linux——fork复制进程

1)shell: 在计算机科学中&#xff0c;Shell俗称壳&#xff08;用来区别于核&#xff09;&#xff0c;是指“为使用者提供操作界面”的软件&#xff08;command interpreter&#xff0c;命令解析器&#xff09;。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&…

SpringBoot中的Redis的简单使用

在Spring Boot项目中使用Redis作为缓存、会话存储或分布式锁等组件&#xff0c;可以简化开发流程并充分利用Redis的高性能特性。以下是使用Spring Boot整合Redis的详细步骤&#xff1a; 1. 环境准备 确保开发环境中已安装&#xff1a; Java&#xff1a;用于编写和运行Spring…

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据&#xff0c;说明网关已生效&#xff0c;其原理流程图如下&#xff1a; 二、网关过滤器 作用&#xff1a;处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类&#xff1a; a. 某个路由的过滤器 …

LeetCode Meditations:合并 K 排序列表

描述 合并K分类列表 状态&#xff1a; 您有一系列 k 链接-列表 lists &#xff0c;每个链接-列表按升序排序。 合并所有链接-列表为一个排序的链接-列出并返回。 例如&#xff1a; Input: lists [[1, 4, 5], [1, 3, 4], [2, 6]] Output: [1, 1, 2, 3, 4, 4, 5, 6] Explanatio…

地理信息系统(ArcGIS)在水文水资源、水环境中的应用

刘老师&#xff08;副教授&#xff09;&#xff1a;来自北京重点高校资深专家&#xff0c;长期从事水资源与水环境、流域污染控制与管理、非点源模拟与控制、环境信息系统开发、环境遥感与GIS应用等领域的研究&#xff0c;发表多篇Sci论文、具有资深的技术底蕴和专业背景。 1、…

MapTracker:Tracking with Strided Memory Fusion for Consistent Vector HD Mapping

参考代码&#xff1a;MapTracker 动机与出发点 为了提升帧间检测的稳定性通常会添加时许信息&#xff0c;这个可以BEV特征处做时序融合&#xff0c;也可以是用当前帧query去cross-attn历史帧信息&#xff0c;则更多的时候是将之前帧信息与当前做融合或者cross-attn实现信息传…

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询&#xff1a; 猜解列名 ?id1) order by 3-…

SIC知识--(1):来龙去脉

一、碳化硅的起源 1891年&#xff0c;当时爱德华古德里奇艾奇逊在尝试制造人造金刚石的过程中意外发现了这一材料。艾奇逊将黏土&#xff08;铝硅酸盐&#xff09;与粉状焦炭&#xff08;碳&#xff09;混合后在电炉中加热&#xff0c;预期得到金刚石&#xff0c;却意外获得了一…

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

Mac安装配置ElasticSearch和Kibana 8.13.2

系统环境&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) 一、准备 从Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic上下载ElasticSearch和Kibana 笔者下载的是 elasticsearch-8.13.2-darwin-aarch64.tar.gz kibana-8.13.2-darwin-aarch64.tar.gz 并放置到个人…

关于ASP.NET Core WebSocket实现集群的思考

前言 提到WebSocket相信大家都听说过&#xff0c;它的初衷是为了解决客户端浏览器与服务端进行双向通信&#xff0c;是在单个TCP连接上进行全双工通讯的协议。在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮询&#xff0c;来实现服务端的变更响应到客户端&…