QT中的信号和槽函数

一 信号和槽机制
1 概念
    信号和槽是Qt中自行定义的一种通信机制,实现对象之间的交互,当某个对象发生改变时将会发送信号,该信号可以被其它对象接收,接收以后将执行一个指定的成员函数(槽函数).

图解:

2 定义
1)包含信号或槽的类必须是QObject的子类
2)信号使用“signals:”标记,信号函数只需声明,不能写定义
3)槽使用“public slots:”标记,槽函数可以和某个信号建立连接,通过某个信号触发槽函数的执行;另外槽函数也可以当做是普通的成员函数,直接调用
4)包含信号或槽的类,前面需要添加宏"Q_OBJECT",将来构建工程时,会调用moc(元对象编译器)将语法扩展的信号或槽还原为标准C++代码.

代码的实现格式:
      class XX:public QObject{
          Q_OBJECT //moc
      signals:
          void sigFunc(void);//信号函数
      public slots:
          void slotFunc(void){...}//槽函数
      };    


3 信号和槽连接
  QObject::connect(
      const QObject* sender,        //信号发送对象,可以是QObject所有子类类型 
      const char* signal,         //信号函数
      const QObject* receiver,     //信号接收对象,可以是QObject所有子类类型
      const char* method);        //槽函数


  :    
      SIGNAL(信号函数(参数表))    //将信号函数转换为const char*
      SLOT(槽函数(参数表))        //将槽函数转换为const char*
案例:创建一个Qt应用程序,里面包含一个标签和一个按钮,实现点击按钮关闭标签。

4 信号和槽连接的语法要求
1)信号和槽参数要一致
    QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int)));//ok
    QObject::connect(A,SIGNAL(sigFunc(void)),B,SLOT(slotFunc(int)));//error

 Qt老版本中槽函数的实现:

     connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int)));

 Qt新版本中槽函数的实现:

     connect(A,Signal1,B,Slot1);

老版本槽函数函数的特点:优点 参数 很直观  缺点 不做类型检测   所以不推荐使用


2)可以带有缺省参数
    class B{
        Q_OBJECT
    public slots:
        void slotFunc(int i=0){}
    };
    QObject::connect(A,SIGNAL(sigFunc(void)),B,SLOT(slotFunc(void)));//ok
3)信号函数的参数可以比槽函数参数多,多余参数将被忽略    相反则不可以
    QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(void)));//ok
4)一个信号可以同时连接多个槽函数(一对多)
    QObject::connect(A,SIGNAL(sigFunc(int)),B1,SLOT(slotFunc1(int)));//ok
    QObject::connect(A,SIGNAL(sigFunc(int)),B2,SLOT(slotFunc2(int)));//ok
    注:如果A对象发送喜好,B1和B2的槽函数都会被执行
5)多个信号可以同时连接到同一个槽函数(多对一)
    QObject::connect(A1,SIGNAL(sigFunc1(int)),B,SLOT(slotFunc(int)));//ok
    QObject::connect(A2,SIGNAL(sigFunc2(int)),B,SLOT(slotFunc(int)));//ok
    注:无论A1或A2发送信号,B的槽函数都会被执行
6)两个信号函数可以直接连接(信号串联)//了解
    QObject::connect(A1,SIGNAL(sigFunc1(int)),A2,SIGNAL(sigFunc2(int)));//ok
    注:当A1发送信号时,所连接的A2对象的信号也将被发送.

在应用槽函数的很多时候也用到了lambda表达式;

Lambda表达式:用于定义并创建匿名的函数对象。

Lambda的语法形式如下:

              [函数对象参数] (操作符重载函数参数) mutable 或exception声明 ->返回值类型 {函数体}

              []是lambda表达式,选择传递的方式

             [](){Btn->settext("aaaa");};

            1,值传递

             [=](){Btn->settext("aaaa");};

            2,址 传递

             [&](){Btn->settext("aaaa");};

具体的使用方法,参考百度。

发布了9 篇原创文章 · 获赞 6 · 访问量 1996

猜你喜欢

转载自blog.csdn.net/GG802312/article/details/105416807