[Qt学习]Qt类中Q_OBJECT的作用及其程序代码体现-创新互联

Qt中类里为什么要加上Q_OBJECT这个东西呢,原来这是一个Qt定义的宏.它的作用是什么呢?
原来这个宏中包含了Qt中最重要的一个机制:也就是信号和槽的机制.所有的Qt程序一定会使用这个机制!

创新互联建站主营樟树网站建设的网络公司,主营网站建设方案,重庆APP软件开发,樟树h5微信平台小程序开发搭建,樟树网站营销推广欢迎樟树等地区企业咨询

下面我们可以先看一个简单的小程序,一个类似于图片加载器的小程序.

以下是先用Qt设计师简单拖拽出来的一个没有经过布局的图片:

[Qt学习]Qt 类中Q_OBJECT的作用及其程序代码体现

我拖拽了一个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的构造函数中,ui.setupUi(this);用来调用Qt设计师中通过拖拽而形成的页面.
第7.8行:对于两个StringList的初始化,也就是把图片的相对路径放到容器中,方便以后调用.
第9行:ui.label->setScaledContents(true);这个成员函数的作用是把label框中的东西进行填充,举个例子,如果里面放了张图片,但是图片的大小比label框要小,那么label框中就会有一些多余的空白,显得很难看,而调用了这个函数之后,就可以让图片填充满这个label框.
第10行:this->setWindowTitle(QString::fromLocal8Bit(“图片游览”));首先通过this指针来设置当前的标题为”图片游览”,但是由于Qt的编码问题,显示中文的话就会乱码,所以有了fromLocal8Bit()这个函数,它是静态的,所以可以直接用QString这个类名来调用它.
第11.12行:通过调用QObject::connect().这个连接函数,来吧QPushButton和Label连接起来,QPushButton如果被单击了,就会发出clicked()信号,所以会调用一个我们自定义的showSeaPictureSlot函数,这就体现了信号与槽的机制.等于把两个部件连接了起来,搭上了一层关系.

initSeaList函数中:首先我把10张图片放在了文件夹里,然后放在了Pixmap文件中这里是我对于10张图片的命名.
[Qt学习]Qt 类中Q_OBJECT的作用及其程序代码体现


然后把Pixmap文件放在了这里:
[Qt学习]Qt 类中Q_OBJECT的作用及其程序代码体现
特别注意,要想在程序中调用外部图片或者电影资源的话,最好和qrc文件放在一起.这样可以便于查找路径.(小编用的VS2013+Qt5.2版本,如果不会搭建这个环境的话,可以看我第一个帖子.)


initSeaList()函数中:QString类似于STL中的string,可以直接进行字符串相加,而资源文件的路径是从qrc文件开始的.所以QString path = “Pixmap/sea/” + QString::number(i) + “.jpg”;,QString::number()也是QString的一个静态函数,可以把数字转化为字符串,十分的方便.
然后调用seaList.push_back(path);把图片的路径放进去就行了.

showCliffPictureSlot()函数中:label->setPixmap(QPixmap())),这个函数是在label框中设置一个图片的,并且QStringList类似于STL中的vector.所以它也是重载了[]的,可以直接调用.用cliffNumber保存上一次的序号,可以方便游览下一张,而cliffNumber%10的作用是:避免访问的序号超过容器的大小.类似于以前的循环队列的做法.

以下是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

这里是运行编译后的展示.
[Qt学习]Qt 类中Q_OBJECT的作用及其程序代码体现


总结:
Q_OBJECT宏有着连接信号与宏的功能,一旦类中没有这个宏定义的话,信号与槽的关联也就消失了,有兴趣的小伙伴们可以做个测试,你把这个宏给注释掉,你就会发现程序一样可以正常编译通过,且成功运行,但是我点击按钮后,图片是不会显示的,原因就是缺少这个宏!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:[Qt学习]Qt类中Q_OBJECT的作用及其程序代码体现-创新互联
当前网址:http://azwzsj.com/article/hooph.html