溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

[Qt學(xué)習(xí)]Qt 類中Q_OBJECT的作用及其程序代碼體現(xiàn)

發(fā)布時(shí)間:2020-07-16 12:19:09 來源:網(wǎng)絡(luò) 閱讀:10042 作者:閉上左眼 欄目:軟件技術(shù)

Qt中類里為什么要加上Q_OBJECT這個(gè)東西呢,原來這是一個(gè)Qt定義的宏.它的作用是什么呢? 
原來這個(gè)宏中包含了Qt中最重要的一個(gè)機(jī)制:也就是信號(hào)和槽的機(jī)制.所有的Qt程序一定會(huì)使用這個(gè)機(jī)制!

下面我們可以先看一個(gè)簡單的小程序,一個(gè)類似于圖片加載器的小程序.

以下是先用Qt設(shè)計(jì)師簡單拖拽出來的一個(gè)沒有經(jīng)過布局的圖片:

[Qt學(xué)習(xí)]Qt 類中Q_OBJECT的作用及其程序代碼體現(xiàn)

我拖拽了一個(gè)QLabel框,兩個(gè)QPushButton,并且給他們改過了對象名.


以下是picture.cpp中的代碼:我會(huì)一行一行的解釋.

#include "picture.h"picture::picture(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    initSeaList();
    initCliffList();
    ui.label->setScaledContents(true);    this->setWindowTitle(QString::fromLocal8Bit("圖片游覽"));
    connect(ui.seaButton, SIGNAL(clicked()), this, SLOT(showSeaPictureSlot()));
    connect(ui.cliffButton, SIGNAL(clicked()), this, SLOT(showCliffPictureSlot()));
}

picture::~picture()
{

}void picture::showSeaPictureSlot()
{
    ui.label->setPixmap(QPixmap(seaList[seaNumber % 10]));
    seaNumber++;
}void picture::initSeaList()
{    for (int i = 0; i < 10; ++i)
    {
        QString path = "Pixmap/sea/" + QString::number(i) + ".jpg";
        seaList.push_back(path);
    }
}void picture::showCliffPictureSlot()
{
    ui.label->setPixmap(QPixmap(cliffList[cliffNumber % 10]));
    cliffNumber++;
}void picture::initCliffList()
{    for (int i = 0; i < 10; ++i)
    {
        QString path = "Pixmap/cliff/" + QString::number(i) + ".jpg";
        cliffList.push_back(path);
    }
}123456789101112131415161718192021222324252627282930313233343536373839404142434445

第1行:包含了”picture.h”文件,不用多解釋吧. 
第6行:picure的構(gòu)造函數(shù)中,ui.setupUi(this);用來調(diào)用Qt設(shè)計(jì)師中通過拖拽而形成的頁面. 
第7.8行:對于兩個(gè)StringList的初始化,也就是把圖片的相對路徑放到容器中,方便以后調(diào)用. 
第9行:ui.label->setScaledContents(true);這個(gè)成員函數(shù)的作用是把label框中的東西進(jìn)行填充,舉個(gè)例子,如果里面放了張圖片,但是圖片的大小比label框要小,那么label框中就會(huì)有一些多余的空白,顯得很難看,而調(diào)用了這個(gè)函數(shù)之后,就可以讓圖片填充滿這個(gè)label框. 
第10行:this->setWindowTitle(QString::fromLocal8Bit(“圖片游覽”));首先通過this指針來設(shè)置當(dāng)前的標(biāo)題為”圖片游覽”,但是由于Qt的編碼問題,顯示中文的話就會(huì)亂碼,所以有了fromLocal8Bit()這個(gè)函數(shù),它是靜態(tài)的,所以可以直接用QString這個(gè)類名來調(diào)用它. 
第11.12行:通過調(diào)用QObject::connect().這個(gè)連接函數(shù),來吧QPushButton和Label連接起來,QPushButton如果被單擊了,就會(huì)發(fā)出clicked()信號(hào),所以會(huì)調(diào)用一個(gè)我們自定義的showSeaPictureSlot函數(shù),這就體現(xiàn)了信號(hào)與槽的機(jī)制.等于把兩個(gè)部件連接了起來,搭上了一層關(guān)系.

initSeaList函數(shù)中:首先我把10張圖片放在了文件夾里,然后放在了Pixmap文件中這里是我對于10張圖片的命名. 
[Qt學(xué)習(xí)]Qt 類中Q_OBJECT的作用及其程序代碼體現(xiàn)


然后把Pixmap文件放在了這里: 
[Qt學(xué)習(xí)]Qt 類中Q_OBJECT的作用及其程序代碼體現(xiàn) 
特別注意,要想在程序中調(diào)用外部圖片或者電影資源的話,最好和qrc文件放在一起.這樣可以便于查找路徑.(小編用的VS2013+Qt5.2版本,如果不會(huì)搭建這個(gè)環(huán)境的話,可以看我第一個(gè)帖子.)


initSeaList()函數(shù)中:QString類似于STL中的string,可以直接進(jìn)行字符串相加,而資源文件的路徑是從qrc文件開始的.所以QString path = “Pixmap/sea/” + QString::number(i) + “.jpg”;,QString::number()也是QString的一個(gè)靜態(tài)函數(shù),可以把數(shù)字轉(zhuǎn)化為字符串,十分的方便. 
然后調(diào)用seaList.push_back(path);把圖片的路徑放進(jìn)去就行了.

showCliffPictureSlot()函數(shù)中:label->setPixmap(QPixmap())),這個(gè)函數(shù)是在label框中設(shè)置一個(gè)圖片的,并且QStringList類似于STL中的vector.所以它也是重載了[]的,可以直接調(diào)用.用cliffNumber保存上一次的序號(hào),可以方便游覽下一張,而cliffNumber%10的作用是:避免訪問的序號(hào)超過容器的大小.類似于以前的循環(huán)隊(duì)列的做法.

以下是picture.h的代碼:

#ifndef PICTURE_H#define PICTURE_H#include <QtWidgets/QWidget>#include "ui_picture.h"#include <QLabel>#include <QPushButton>#include <QPixmap>class picture : public QWidget{
    Q_OBJECTprivate slots:    void showSeaPictureSlot();    void showCliffPictureSlot();public:
    picture(QWidget *parent = 0);
    ~picture();    void initSeaList();    void initCliffList();private:
    Ui::pictureClass ui;    int seaNumber = 0;    int cliffNumber = 0;
    QStringList seaList;
    QStringList cliffList;
};#endif // PICTURE_H1234567891011121314151617181920212223242526272829303132

這里是運(yùn)行編譯后的展示. 
[Qt學(xué)習(xí)]Qt 類中Q_OBJECT的作用及其程序代碼體現(xiàn)


總結(jié): 
Q_OBJECT宏有著連接信號(hào)與宏的功能,一旦類中沒有這個(gè)宏定義的話,信號(hào)與槽的關(guān)聯(lián)也就消失了,有興趣的小伙伴們可以做個(gè)測試,你把這個(gè)宏給注釋掉,你就會(huì)發(fā)現(xiàn)程序一樣可以正常編譯通過,且成功運(yùn)行,但是我點(diǎn)擊按鈕后,圖片是不會(huì)顯示的,原因就是缺少這個(gè)宏!


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI