QT的信号与槽 以及自定义信号槽

所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(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中引入的

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值