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
英文地址,請注明出處:http://en.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…

一款功能全面的文體場所預約小程序

大家好?? ,我是 阿問學長!專注于分享優質開源項目解析、計算機學習資料推薦,并為同學們提供畢業設計項目指導支持,歡迎關注交流!?? 項目概述 隨著全民健身的普及,各地新建了大批體育、健身、文化娛樂場所,中小學校園的運動設施也開始對市民開放。為了合理安排主辦…