Qt中類里為什么要加上Q_OBJECT這個東西呢,原來這是一個Qt定義的宏.它的作用是什么呢?
原來這個宏中包含了Qt中最重要的一個機(jī)制:也就是信號和槽的機(jī)制.所有的Qt程序一定會使用這個機(jī)制!
公司主營業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出思明免費(fèi)做網(wǎng)站回饋大家。
下面我們可以先看一個簡單的小程序,一個類似于圖片加載器的小程序.
以下是先用Qt設(shè)計師簡單拖拽出來的一個沒有經(jīng)過布局的圖片:
我拖拽了一個QLabel框,兩個QPushButton,并且給他們改過了對象名.
以下是picture.cpp中的代碼:我會一行一行的解釋.
#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è)計師中通過拖拽而形成的頁面.
第7.8行:對于兩個StringList的初始化,也就是把圖片的相對路徑放到容器中,方便以后調(diào)用.
第9行:ui.label->setScaledContents(true);這個成員函數(shù)的作用是把label框中的東西進(jìn)行填充,舉個例子,如果里面放了張圖片,但是圖片的大小比label框要小,那么label框中就會有一些多余的空白,顯得很難看,而調(diào)用了這個函數(shù)之后,就可以讓圖片填充滿這個label框.
第10行:this->setWindowTitle(QString::fromLocal8Bit(“圖片游覽”));首先通過this指針來設(shè)置當(dāng)前的標(biāo)題為”圖片游覽”,但是由于Qt的編碼問題,顯示中文的話就會亂碼,所以有了fromLocal8Bit()這個函數(shù),它是靜態(tài)的,所以可以直接用QString這個類名來調(diào)用它.
第11.12行:通過調(diào)用QObject::connect().這個連接函數(shù),來吧QPushButton和Label連接起來,QPushButton如果被單擊了,就會發(fā)出clicked()信號,所以會調(diào)用一個我們自定義的showSeaPictureSlot函數(shù),這就體現(xiàn)了信號與槽的機(jī)制.等于把兩個部件連接了起來,搭上了一層關(guān)系.
initSeaList函數(shù)中:首先我把10張圖片放在了文件夾里,然后放在了Pixmap文件中這里是我對于10張圖片的命名.
然后把Pixmap文件放在了這里:
特別注意,要想在程序中調(diào)用外部圖片或者電影資源的話,最好和qrc文件放在一起.這樣可以便于查找路徑.(小編用的VS2013+Qt5.2版本,如果不會搭建這個環(huán)境的話,可以看我第一個帖子.)
initSeaList()函數(shù)中:QString類似于STL中的string,可以直接進(jìn)行字符串相加,而資源文件的路徑是從qrc文件開始的.所以QString path = “Pixmap/sea/” + QString::number(i) + “.jpg”;,QString::number()也是QString的一個靜態(tài)函數(shù),可以把數(shù)字轉(zhuǎn)化為字符串,十分的方便.
然后調(diào)用seaList.push_back(path);把圖片的路徑放進(jìn)去就行了.
showCliffPictureSlot()函數(shù)中:label->setPixmap(QPixmap())),這個函數(shù)是在label框中設(shè)置一個圖片的,并且QStringList類似于STL中的vector.所以它也是重載了[]的,可以直接調(diào)用.用cliffNumber保存上一次的序號,可以方便游覽下一張,而cliffNumber%10的作用是:避免訪問的序號超過容器的大小.類似于以前的循環(huán)隊列的做法.
以下是picture.h的代碼:
#ifndef PICTURE_H#define PICTURE_H#include#include "ui_picture.h"#include #include #include 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)行編譯后的展示.
總結(jié):
Q_OBJECT宏有著連接信號與宏的功能,一旦類中沒有這個宏定義的話,信號與槽的關(guān)聯(lián)也就消失了,有興趣的小伙伴們可以做個測試,你把這個宏給注釋掉,你就會發(fā)現(xiàn)程序一樣可以正常編譯通過,且成功運(yùn)行,但是我點(diǎn)擊按鈕后,圖片是不會顯示的,原因就是缺少這個宏!