這一節是對上一節的補充,上一節提到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. 添加資源庫


(2)?在Qt Creator中選中項目名稱,鼠標右鍵,點擊添加“新文件”
(3)在彈出的窗口中,選擇添加文件類型:





4. 使用資源庫添加靜態圖片
還記得上一節使用的QLabel類,它是一種顯示文字和圖片的組件,這里我們就添加一個label組件,再給它設上圖片:
(1) 使用ui界面直接設置:
先拖一個label:
選中label組件,選擇左下角屬性直接設置圖片:

其他屬性可以參考上一節自行修改。?
(2)使用代碼添加圖片

2. 如果通過代碼添加,需要用到頭文件#include<QPixmap>頭文件,圖片類頭文件。函數:
// 圖片類構造函數
// 參數1:圖片資源路徑(qrc文件選中圖片資源鼠標右鍵復制)
// 參數2:樣板格式,使用默認值即可
// 參數3:圖片顏色格式,也是使用默認即可
QPixmap::?QPixmap(const QString & fileName, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor)
// 縮放
// 參數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(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
#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
#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
#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可以管理不同類型的按鈕,但常用于同類型按鈕的分組。