QT基础(四)----信号和槽

创建类MySignal,继承与QObject


头文件MySignal.h

#ifndef MYSIGNAL_H
#define MYSIGNAL_H

#include <QObject>

class MySignal : public QObject
{
    Q_OBJECT
public:
    explicit MySignal(QObject *parent = 0);

signals:
    //定义信号函数,信号和槽完全是分开的,在不同的类中,通过第三方的main函数将信号和槽匹配起来
    //必须写在signal中且不用实现,只需定义即可
    void sig();

public slots:
};

#endif // MYSIGNAL_H

源文件MySignal.cpp

#include "MySignal.h"

MySignal::MySignal(QObject *parent) : QObject(parent)
{

}

创建类MySlot,继承与QObject


头文件 MySlot.h

#ifndef MYSLOT_H
#define MYSLOT_H

#include <QObject>

class MySlot : public QObject
{
    Q_OBJECT
public:
    explicit MySlot(QObject *parent = 0);

signals:

public slots:
    //定义槽函数,需要实现,必须放在slots里边
    void slot();
};

#endif // MYSLOT_H

源文件MySlot.cpp

#include "MySlot.h"
#include<QDebug>

MySlot::MySlot(QObject *parent) : QObject(parent)
{

}

//定义槽函数
void MySlot::slot()
{
    qDebug()<<"MySlot is called!";
}

主函数main.cpp

#include <QCoreApplication>  //用于绘制没有图像程序的头文件,此时在.pro文件中可以不添加额外代码
#include "MySignal.h"
#include "MySlot.h"

/*
 * 1)信号的定义必须在signals保留字下,并且不需要实现
 * 2)槽的定义必须在slots保留字下,需要实现
 * 3)信号和槽通过QObject::connect函数连接
 * 4)当信号被触发时,槽函数被调用
*/

/*
 * 注意事项
 *1)信号和槽,是QT的拓展,所以必须实现信号和槽的类,必须是QObject 的子类
 * 2)实现信号和槽的类,必须以宏Q_OBJECT开始
 * 3)连接信号和槽,要用到SIGNAL和SLOT宏,转换函数为字符串
 * 4)一个信号可以和多个槽函数连接,槽函数调用的顺序是不确定的
 * 5)多个信号可以同时连接一个槽
 * 6)信号可以连接信号,形成信号传导
 * 7)信号和槽的参数应该一样多且类型必须相同
 * 8)信号可以重载
 * 9)槽可以重载
 * 10)信号和槽都可以有默认参数
 * 11)槽函数何以向普通函数一样被调用
 * 12)槽函数中,调用sender可以获得信号调用者,也就是说同时sender来观察谁在调用该函数
*/

/*
 * 总结
 * 一个类:QObject
 * 三个宏:QObject,SIGNAL,SLOT
 * 三个保留字:signals,slots,emit
*/


int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    MySignal sigal;
    MySlot slot;

    //connect是QObject的一个静态函数
    QObject::connect(&sigal, SIGNAL(sig()), &slot, SLOT(slot()));

    //发射一个信号
    emit sigal.sig();

    return app.exec();
}

运行结果:输出MySlot is called!

你可能感兴趣的:(qt,信号,槽)