-
新建项目SignalAndSlot项目
编写代码如下:
mysignal.h
#ifndef MYSIGNAL_H
#define MYSIGNAL_H
#include <QObject>
class MySignal : public QObject
{
Q_OBJECT
public:
explicit MySignal(QObject *parent = 0);
signals:
void sig();
public slots:
};
#endif
mysignal.cpp
#include "mysignal.h"
MySignal::MySignal(QObject *parent) :
QObject(parent)
{
}
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:
void slot();
};
#endif // MYSLOT_H
myslot.cpp
#include "myslot.h"
#include <QDebug>
MySlot::MySlot(QObject *parent) :
QObject(parent)
{
}
void MySlot::slot()
{
qDebug() << "MySlot::slot is called";
}
Main.cpp
#include <QCoreApplication>
#include "mysignal.h"
#include "myslot.h"
/*
*1)信号的定义必须在signals:保留字下,并且不需要实现
*2)槽的定义必须在slots:保留字下,需要实现
*3)信号和槽通过QObject::connect函数连接
*4)当信号被触发是,槽函数被调用
*
*需要注意的是:
*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)在槽函数中,调用sender可以获得信号调用者
*
* 总结下:
* 一个类:QObject
* 三个宏:Q_OBJECT SIGNAL SLOT
* 三个保留字:signals, slots, emit
*/
int main(int argc,char** argv)
{
QCoreApplication app(argc,argv);
MySignal sig;
MySlot slot;
//通过QObject的connect实现信号和槽函数之间的关联,
//当调用了信号之后槽函数也相应的被调用了
QObject::connect(&sig, SIGNAL(sig()), &slot, SLOT(slot()));
//通过下面一行实现发射一个信号
emit sig.sig();
return app.exec();
}
运行结果: