QT信号和槽

什么是信号和槽

> 信号和槽是QT自行定义的一种通信机制,实现对象之间的数据交互。

> 当用户或系统触发了一个动作,导致某个控件的状态发生了改变,该控件就会发射一个信号,

即调用其类中一个特定的成员函数(信号),同时还可能携带有必要的参数

> 槽和普通的成员函数几乎没有太多区别,可以是公有的、保护的或私有的 ,可以被重载,也可以被覆盖,其参数可以是任意类型 ,并可以像普通成员函数一样调用

>槽函数与普通成员函数的差别并不在于其语法特性,而在于其功能。槽函数更多体现为对某种

特定信号的处理,可以将槽和其它对象信号建立连接,这样当发射信号时,槽函数将被触发和执行,进而来完成具体功能

 

   

信号的定义

class XX : public Qoject{

  Q_OBJECT        //是一个宏

signals:

  void signal_func(..);  //信号函数

};

 

Q_OBJECT:

  对于Q_OBECT宏,其是实现任何信号,槽或者属性的强制性要求。不管是否需要实现这些机制,都要求使用这个宏。这个宏包含了Qt中信号和槽的机制。

宏所对应的Qt里面的一个链接工具(MOC)用于处理语法扩展。在构建工程时,有这种处理语法扩展标记,会把信号和槽的语法扩展还原为标准c++代码,通过c++标准编译器,执行连接。

 

注:信号函数只需要声明,不能写定义

 

 

 

槽的定义

class XX:public QObject{

  Q_OBJECT

public slots;

  void slot_func(...){...}  //槽函数

};

注:槽函数可以连接到某个信号上,当信号被发射时,槽函数将被触发和执行,而且槽函数也可以当做普通的成员函数直接使用。

 

 

建立信号和槽的连接

QObject::connect( const QObject*sender, const char*signal,

const QObject* receiver, const char* method);

参数∶

  sender∶信号发送对象指针

  signal∶要发送的信号函数,可以使用"SIGNAL(.)" 宏进行类型转换 receiver∶信号的接收对象指针

  method∶接收信号后要执行的槽函数,,可以使用"SLOT()"宏进行类型转换

 只要是QOject类型的指针(不论是QOject或者其子类),都可以作为信号发送者

 

案例:创建Qt应用程序,包含标签和按钮,两个控件,实现点击按钮关闭标签

>按钮点击时发送信号:clicked()

>实现标签关闭功能的槽:close()

实现:

#include "mainwindow.h"
#include <QApplication>
#include <QWidget>
#include<QLabel>
#include<mainwindow.h>
#include<QDialog>
#include<QPushButton>
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QDialog parent; //father window
  QLabel label("我是标签",&parent);

  label.move(50,40);
  QPushButton button("我是按钮",&parent);

  button.move(50,140);

  parent.show();    //点击按钮关闭标签
  QObject::connect(&button,SIGNAL(clicked(void),&label,SLOT(close(void));

  MainWindow w;
  w.show();

return a.exec();
}

运行结果:

                                    QT信号和槽

 

 

 

信号和槽连接的语法要求  

>信号和槽参数要一致

  QObjectconnect(A,SIGNAL(sigfun(int), B,SLOT(slotfun(int));//ok                      QObject:connect(A,SIGNAL(sigfun(int), B,SLOT(slotfun(int,int));//error

> 可以带有缺省参数

  QObject::connect(A,SIGNAL(sigfun(int)), B,SLOT(slotfun(int,int=O);//ok

> 信号函数的参数可以多于槽函数,多余参数将被忽略

  QObjectconnect(A,SIGNAL(sigfun(int,int)), B,SLOT(slotfun(int));//ok

 

信号和槽连接的应用

> 一个信号可以被连接到多个槽(一对多)

  QObjectconnect(A,SIGNAL(sigfun(int), B1,SLOT(slotfun1(int))//ok                                   QObjectconnect(A,SIGNAL(sigfun(int),B2,SLOT(slotfun2(int));//ok

> 多个信号也可以连接到同一个槽(多对一)

  QObjectconnect(A1,SIGNAL(sigfun1(int)), B,SLOT(slotfun(int);//ok                                       QObject::connect(A2,SIGNAL(sigfun2(int),B,SLOT(slotfun(int);//ok

> 两个信号可以直接连接(信号级联) //用于消息传递

  QObject::connect(A1,SIGNAL(sigfun1(int), A2,SIGNAL(sigfun2(int));//ok

 

上一篇:signal信号


下一篇:操作系统进程同步(案例说明) 学习笔记