Qt(资源库和按钮组)

这一节是对上一节的补充,上一节提到QLabel类和QAabstractButton类,这节内容:

1.如设置资源库,使用资源设置图片

2. 使用按钮组管理多个按钮。

一、资源库

1. 资源库作用

Qt的资源库(Resource System,.qrc文件)可以将图片、音频、UI文件等外部资源文件打包进项目,成为项目的一部分。

2. 特点

(1). 虚拟路径机制

通过.qrc文件为资源分配虚拟路径(如 :/images/logo.png),在代码中用虚拟路径访问资源,而不是硬编码磁盘路径。

(2). 跨平台无忧

资源被打包进可执行文件或资源文件,无论项目拷贝到哪个环境、系统或设备,只要可执行文件在,资源都能被正确访问,不会因路径变化或缺失而出错。

(3). 使用方便

在项目的任何地方都可以通过虚拟路径访问资源(如QPixmap(":/images/logo.png")),无需关心实际文件存放位置。

(4). 项目分发更简单

只需分发可执行文件(或带资源的安装包),不必单独拷贝图片等资源文件,避免“找不到图片”等问题。

(5). 资源安全性

资源打包后不易被随意修改或替换,提升了项目的完整性和安全性。

3. 添加资源库

(1)把命名好的(不包含任何的中文)图片文件放置到项目的工作目录中。最好新建一个文件夹专门放图片,后续好找。
进入项目文件目录:
图片放入项目文件夹内:

(2) 在Qt Creator中选中项目名称,鼠标右键,点击添加“新文件”

(3)在弹出的窗口中,选择添加文件类型:

(4)在弹出的窗口中给资源文件命名 ,例如res

(5)在项目管理界面直接点击完成,可以看到在项目中多了一个qrc格式的资源文件。
(6)选中qrc文件,点击,可以给资源文件新建一个虚拟路径。
(7)选中qrc文件,点击,可以导入图片到项目中成为资源。
(8)导入成功后,可以在qrc文件中看到导入成功的图片:
(9)重新构建项目,带你左下角小锤子:
 

4. 使用资源库添加静态图片

还记得上一节使用的QLabel类,它是一种显示文字和图片的组件,这里我们就添加一个label组件,再给它设上图片:

(1) 使用ui界面直接设置:

先拖一个label:

选中label组件,选择左下角属性直接设置图片:

其他属性可以参考上一节自行修改。 

(2)使用代码添加图片

1. 我们也可以通过代码添加图片,以及修改图片尺寸。我们先将缩放模式取消掉,然后取消图片。

2. 如果通过代码添加,需要用到头文件#include<QPixmap>头文件,图片类头文件。函数:

// 图片类构造函数
// 参数1:图片资源路径(qrc文件选中图片资源鼠标右键复制)
// 参数2:样板格式,使用默认值即可
// 参数3:图片颜色格式,也是使用默认即可
QPixmap::​QPixmap(const QString & fileName, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor)
3. 当前已经创建图片类对象,但是还需要进行缩放,指定图片的输出模式。函数:
// 缩放
// 参数1:QSize类型对象,表示目标尺寸。需要添加头文件#include<QSize>
// 参数2:缩放模式,三种。是一个枚举
// 参数3:以速度优先还是质量优先,两种模式,默认以速度优先,也是一个枚举
// 返回值:转换后的QPixmap对象
QPixmap QPixmap::​scaled(const QSize & size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
QSize类
// 构造函数
// 图片的宽度和高度
QSize::​QSize(int width, int height)

复制资源虚拟路径:

 代码:

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPixmap>
#include <QSize>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;
};#endif // DIALOG_H
dialog.cpp:
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);// 创建一个图片对象// 参数:图片的资源路径QPixmap pic(":/new/prefix1/picture1/idol.png");// 定义QSize对象QSize size(ui->label->width(),ui->label->height());// 缩放pic = pic.scaled(size,Qt::KeepAspectRatio,Qt::SmoothTransformation);// 使用界面文件中的组件对象ui->label->setPixmap(pic);}Dialog::~Dialog()
{delete ui;
}

5. 使用资源库添加动态图

(1)需要将我们的动态图,放到项目的工作目录中,并且进行命名.gif

(2)添加完成后,需要将动态图,加载到资源文件中。

补充:1.别忘了再创建一个label,改名为labelGif。

            2.只有第一次创建资源文件才需要重构项目

QMovie电影类:

如果需要播放动态图,需要用到电影类,需要添加头文件#include<QMovie>。

// 电影类构造函数,堆区创建
// 参数1 :资源路径
// 参数2:输出模式
// 参数3:基类指针,看到基类指针,就知道要创建堆内存对象
QMovie::​QMovie(const QString & fileName, const QByteArray & format = QByteArray(), QObject * parent = 0)

代码:

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPixmap>
#include <QSize>
#include <QMovie>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;QMovie *movie;  // 电影类指针
};#endif // DIALOG_H
dialog.cpp:
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);// 创建一个图片对象// 参数:图片的资源路径QPixmap pic(":/new/prefix1/picture1/idol.png");// 定义QSize对象QSize size(ui->label->width(),ui->label->height());// 缩放pic = pic.scaled(size,Qt::KeepAspectRatio,Qt::SmoothTransformation);// 使用界面文件中的组件对象ui->label->setPixmap(pic);// 创建电影类对象movie = new QMovie(":/new/prefix1/picture1/gege.gif");// 给QLabel设置电影ui->labelGif->setMovie(movie);// 播放电影movie->start();}Dialog::~Dialog()
{delete ui;
}

效果:

注意:

1.UI界面好用但是图片一定要在外面处理好在放到项目中,假如label是50*50的,你的图片是1000*1000的,即使你用了填充,但是还是占内存,所以根据你需要可以调节图片大小后再放入项目中。

2.经过我长时间体验,我推荐几个软件处理图片:

(1)Windows系统自带的照片,为什么不用图画,问就是不好用。这个自带软件主要功能就是调节图片大小,可以按比例调大调小不会裁剪你的图片;还有一个主要功能就是抠图,扣掉背景,这个在写飞机大战等小游戏的时候,可以不让图片背景挡住主背景只显露飞机,就不是一个方框框框了。

(2)美图秀秀,算是不使用vip功能比较多的软件了

二、按钮组

1. 简介:

1.1 介绍

QButtonGroup组件

可以使用QB uttonGroup组件对多个按钮进行分组,这是一个逻辑分组,没有任何的ui效果。其主要的目的是使用一个信号槽同时监控多个按钮对象的状态。

QButtonGroup继承于QOBject并非QWidget,所以它是不可见的,用户无法从这个窗口中看到此组件。

1.2 作用

  • 分组管理:可以把多个按钮归为一组,便于统一处理。
  • 互斥选择:配合QRadioButton实现单选功能(同组内只能选一个)。
  • 信号统一:可以通过QButtonGroup的信号(如buttonClicked(int id))统一响应组内按钮的点击事件。
  • 分配ID:可以为每个按钮分配唯一ID,便于区分和处理。

1.3 函数: 

构造函数:

// 构造函数 堆区创建
QButtonGroup::​QButtonGroup(QObject * parent = 0)

 添加按钮进按钮组:

// 给按钮组,添加要管理的按钮
// 参数1:添加的实际的按钮
// 参数2:序号ID
void QButtonGroup::​addButton(QAbstractButton * button, int id = -1)

信号函数:

参数中表示当前触发的按钮对象本身,表示当前触发的按钮序号。在触发信号后,可以把这个参数传入槽函数,槽函数中可以使用sender() 判断当前触发信号的按钮是按钮组中的哪个。

2. 练习:

拉几个组建

代码:

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QDebug>
#include <QButtonGroup>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;QButtonGroup *btp;private slots:void toggledSlot(bool);void buttonToggledSlot(int,bool);
};#endif // DIALOG_H
dialog.cpp:
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);connect(ui->radioButton,SIGNAL(toggled(bool)),this,SLOT(toggledSlot(bool)));// 创建组件对象btp = new QButtonGroup(this);btp->addButton(ui->checkBox,1);btp->addButton(ui->checkBox_2,2);btp->addButton(ui->checkBox_3,3);btp->addButton(ui->checkBox_4,4);// 注意,我们的按钮组件,是可以多选的,但是按钮组里的组件,默认是互斥的。// 所以,要解除按钮组的互斥属性btp->setExclusive(false);connect(btp,SIGNAL(buttonToggled(int,bool)),this,SLOT(buttonToggledSlot(int,bool)));}Dialog::~Dialog()
{delete ui;
}void Dialog::toggledSlot(bool checked)
{if(checked){qDebug() << "超意兴被选中了";}else{qDebug() << "不选超意兴了";}
}void Dialog::buttonToggledSlot(int id, bool checked)
{if(id == 1){if(checked){qDebug() << "8+1被选中了";}else{qDebug() << "不选8+1了";}}if(id == 2){if(checked){qDebug() << "雷花-勇闯天堂被选中了";}else{qDebug() << "不选雷花-勇闯天堂了";}}if(id == 3){if(checked){qDebug() << "青鸟被选中了";}else{qDebug() << "不选青鸟了";}}if(id == 4){if(checked){qDebug() << "7天被选中了";}else{qDebug() << "不选7天了";}}else{}
}

注意:

  • QButtonGroup本身不负责界面布局,只负责逻辑分组。
  • QButtonGroup可以管理不同类型的按钮,但常用于同类型按钮的分组。

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

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

相关文章

一道检验编码能力的字符串的题目

#include<iostream> #include<vector> #include<string> using namespace std; int bNum0,gNum0; int findEnd(string& s,int si){int lens.size();//当前字母在哪个字符串中,存入comp中string comp;if(s[si]b||s[si]o||s[si]y){comp"boy";bNu…

UniApp X 网络请求避坑指南:从 JS 到 UTS 的 JSON 数据处理全解析

在 UniApp 开发中&#xff0c;我们经常需要通过 uni.request 获取服务器返回的 JSON 数据&#xff0c;并将其绑定到页面或进行逻辑处理。但在 UniApp X&#xff08;基于 UTS&#xff09; 中&#xff0c;由于引入了 强类型语言特性&#xff0c;处理 JSON 数据的方式与 JS 有明显…

iOS 网络请求常用依赖库与系统自带 API 介绍与示例

iOS 网络请求常用依赖库与系统自带 API 介绍与示例 在 iOS 开发中&#xff0c;进行网络请求是几乎所有应用都不可或缺的功能。开发者有多种选择来处理网络通信&#xff0c;从系统自带的 URLSession 到各种流行的第三方库。下面我将为您介绍 URLSession、AFNetworking、Alamofir…

JavaScript 中 let 在循环中的作用域机制解析

一、let在循环中的特殊性 let作为ES6引入的块级作用域声明&#xff0c;在循环结构中存在特殊行为&#xff0c;其核心区别于var的函数作用域特性。理解这一特性对于编写正确的闭包逻辑至关重要。 在 ECMAScript 规范里&#xff0c;let声明的变量具有块级作用域特性&#xff0c;这…

@Subscribe@AllowConcurrentEvents解析这两个注解

@Subscribe@AllowConcurrentEvents解析这两个注解 @Subscribe 和 @AllowConcurrentEvents 是 Guava EventBus(Google 开源的事件总线框架)中用于处理事件订阅的注解,主要用于实现组件间的解耦通信。下面分别解析: 1. @Subscribe 注解 作用:标记一个方法为事件订阅者方法,…

好看的小程序推广单页HTML源码 可用作导航页

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 响应式的小程序推广单页HTML源码。这个设计采用了现代化的UI元素&#xff0c;包含吸引人的标题、特性展示、二维码区域和行动号召按钮。 二、效果展示 1.部分代码 代码如下&#xff0…

华为仓颉编程语言实践体验

华为仓颉编程语言实践体验 目前华为仓颉编程语言因为其推出时间较短&#xff0c;生态系统不完善。官网资料权威&#xff0c;但比较庞大难懂。快速实验入门&#xff0c;是学习一门编程语言的法宝。网上靠谱的资料稀少&#xff0c;特此撰文介绍&#xff0c;帮助初学者减少挫折感&…

YOLOv11实战,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)

2024年计算机视觉领域的颠覆性突破,YOLOv11以22%的参数量减少和0.3%的mAP提升重新定义实时目标检测的边界 本文将手把手带你完成YOLOv11的全流程实战,包含环境配置、数据准备、模型训练、推理部署及创新优化方案,并深度解析其网络架构设计思想。 一、YOLOv11核心创新解析 …

macOS xcode打包ios测试ipa应用包

可以参考&#xff1a; https://blog.csdn.net/sinat_34104446/article/details/133684756 过程中遇到很多稀奇古怪的报错&#xff0c;基本重启电脑即可解决。。。在我按照上面的步骤申请并导入新证书后&#xff0c;还遇到了一个问题&#xff1a;解决办法&#xff1a; https://b…

STM32基础知识学习笔记:ICODE、DCODE、DMA等常见名词的解释

基于AI生成内容。 ICODEICODE&#xff1a;指令总线&#xff08;Instruction Bus&#xff09; 主要用于处理 CPU 对程序指令的读取操作。它是 STM32 存储架构中重要的组成部分&#xff0c;与数据总线&#xff08;DCODE&#xff09;、系统总线&#xff08;System Bus&#xff09;…

谁将统治AI游戏时代?腾讯、网易、米哈游技术暗战

游戏行业的“产能天花板”正被AI技术轰然击穿。腾讯、网易、米哈游……所有的游戏厂商都在押注AI&#xff0c;腾讯混元发布混元游戏视觉生成平台&#xff0c;分钟级生成高精度游戏角色&#xff1b;网易《蛋仔派对》借AI实现UGC创作平民化&#xff1b;米哈游新作更以实时多模态对…

基于springboot的工商局商家管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

ABP VNext + Razor 邮件模板:动态、多租户隔离、可版本化的邮件与通知系统

&#x1f680; ABP VNext Razor 邮件模板&#xff1a;动态、多租户隔离、可版本化的邮件与通知系统 &#x1f4da; 目录&#x1f680; ABP VNext Razor 邮件模板&#xff1a;动态、多租户隔离、可版本化的邮件与通知系统&#x1f31f; 一、TL;DR&#x1f4c8; 二、系统流程图…

疯狂星期四第19天运营日记

网站运营第19天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日访问量42&#xff0c;疯狂之后的冷静&#xff0c;落差太大~~ 今日搜索引擎收录情况 必应仍然是24条记录&#xff0c;无变化 百度0收…

康养休闲旅游服务虚拟仿真实训室:赋能人才培养的创新路径

在康养休闲旅游行业数字化转型与职业教育改革的双重驱动下&#xff0c;康养休闲旅游服务虚拟仿真实训室已成为连接课堂教学与岗位实践的关键枢纽。它通过虚拟仿真技术重构康养服务场景&#xff0c;为学生打造沉浸式实践平台&#xff0c;在人才培养模式创新中发挥着不可替代的作…

python办自动化--读取邮箱中特定的邮件,并下载特定的附件

系列文章目录 python办公自动化–数据可视化&#xff08;pandasmatplotlib&#xff09;–生成条形图和饼状图 python办公自动化–数据可视化&#xff08;pandasmatplotlib&#xff09;–生成折线图 python办公自动化–数据可视化&#xff08;pandas读取excel文件&#xff0c;m…

清理DNS缓存

Cloudflarehttps://1.1.1.1/purge-cacheGooglehttps://dns.google/cacheOpenDNShttps://cachecheck.opendns.comLinux DNS缓存sudo systemd-resolve --flush-caches 或 sudo /etc/init.d/nscd restartWindows DNS缓存ipconfig /flushdnsmacOS DNS缓存sudo dscacheutil -flushca…

用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)

用 Python 写你的第一个爬虫&#xff1a;小白也能轻松搞定数据抓取&#xff08;超详细包含最新所有Python爬虫库的教程&#xff09; 摘要 本文是一篇面向爬虫爱好者的超详细 Python 爬虫入门教程&#xff0c;涵盖了从基础到进阶的所有关键技术点&#xff1a;使用 Requests 与…

openmv识别数字

Lenet是一种卷积识别网络,可以用来识别打印的&#xff0c;或者是手写的数字利用NCC的模板匹配算法来进行数字识别&#xff0c;模板匹配需要我们事先保存需要匹配的数字以及字母的模板图片,模板匹配对于模板的大小和角度&#xff0c;有一定的要求如果数字的大小和角度有所变换&a…

一款功能全面的文体场所预约小程序

大家好👋 ,我是 阿问学长!专注于分享优质开源项目解析、计算机学习资料推荐,并为同学们提供毕业设计项目指导支持,欢迎关注交流!🚀 项目概述 随着全民健身的普及,各地新建了大批体育、健身、文化娱乐场所,中小学校园的运动设施也开始对市民开放。为了合理安排主办…