所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(称为槽(slot))来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。(这里提一句,Qt 的信号槽使用了额外的处理来实现,并不是 GoF 经典的观察者模式的实现方式。)
下面我们先来看看 connect() 函数最常用的一般形式:
connect(sender, signal, receiver, slot);
在 Qt 5 中,QObject::connect() 有五个重载:
QMetaObject::Connection connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const char *,
const char *,
Qt::ConnectionType) const;
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
const QObject *, PointerToMemberFunction,
Qt::ConnectionType)
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
Functor);
注意:因为信号槽实在qt框架中的一个特性,所以请注意connect中参数对象的类型,QObject
自定义信号和槽 用到关键字 signals emit
直接看实例:
信号类:
class Signal:public QObject
{
Q_OBJECT
public:
Signal();
public :
void send(){
emit xinhao(); //这里传出信号,如果调用函数体send ,则会执行emit修饰下的信号,进而触发conne
};
signals: //在这里定义信号,
void xinhao();
};
槽类:
lass Cao:public QObject
{
Q_OBJECT
public:
Cao();
public slots:
void recive(); //这是Cao中一个普普通通的方法
};
主函数类:
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
Signal c; //创建信号和槽的实例cv
Cao v;
QObject::connect(&c,&Signal::xinhao,&v,&Cao::recive);//通过QObject的connec方法将信号槽连接
c.send();//调用signal中的send方法,进而触发槽Cao的recive方法.
return a.exec();
}
注意:
注意:
注意:
重要的事情说三遍:
写信号槽的时候一定要注意信号槽的第五个参数QTconnectType
这是官方的的解释:
Qt::AutoConnection
(默认)如果接收器位于发出信号的线程中。Qt:使用DirectConnection。否则。Qt: QueuedConnection
使用。连接类型是在发出sianal时确定的。
Qt::DirectConnection
当发出信号时立即调用插槽。该插槽在接收者的线程中执行。
Qt::QueuedConnection
当控件返回到接收方线程的事件循环时,将调用插槽。这个插槽在接收者的线程中执行。
Qt::BlockingQueuedConnection
与Qt:QueuedConnection相同,只是信号线程会阻塞,直到插槽返回。如果接收方位于接受者线程中,则不能使用此连接,否则应用程序将死锁。
Qt::UniqueConnection
这是一个标记,可以使用位或与上述任何一种连接类型组合。当设置了Qt::UniqueConnection时,如果连接已经存在,则QObject:connect()将失败(例如,如果相同的sianal已经连接到同一对对象的同一个槽中)。这个标志是在Qt 4.6中引入的