信号是一个特定的标识;一个槽就是一个函数,与一般的函数不同,槽函数既能够和信号关联,也能够像普通函数一样直接调用。
当某个事件出现时,通过发送信号,可以将与之相关联的槽函数激活,即执行槽函数代码。在程序中,使用QObject::connect()函数来讲某个信号和某个槽进行关联,而信号和槽之间的真正关联是由Qt的信号和槽机制来实现的。
信号和槽的关联关系可以有3种模式:
-〉一个信号和一个槽关联;
-〉一个信号和多个槽关联;
-〉多个信号和一个槽关联;
一个信号和多个槽关联的情况下,当发出该信号的时候,与该信号关联的各个槽以任意的先后顺序立即执行。信号和槽机制是完全独立于GUI事件循环的。
此外,信号还可以与信号进行关联。当两个信号关联时,第一个信号的发出将会激Qt发出第二个信号。
信号和槽机制通过QObject::connect(const QObject *sender,const char *signal,const QObject *receiver,const char*method,Qt::ConnectionType type=Qt::AutoCompatConnection)函数关联,参数type定义了信号与槽的关联方式,决定一个信号时立即传递到槽还是排队等待以后传递。
Qt使用了枚举类型Qt::ConnectionType定义了信号与槽的关联方式,有3种:
-〉Qt::DirectConnection,信号发送后立即传递给相关联的槽,只有槽函数执行完毕返回后,发送信号“emit<信号>”之后代码才被执行。
-〉Qt::QueuedConnection,信号发送后排队,直到事件循环(event loop)有能力将他传递给槽。而不管槽函数有没有执行,发送信号“emit<信号>”之后的代码都会立即得到执行。
-〉Qt::AutoConnection,如果信号和槽在同一个线程,信号发出后,槽函数将立即执行,等同于Qt::DirectConnection;如果信号和槽不在同一个线程,信号将排队,等待事件循环的处理,效果等同于Qt::QueuedConnection。
对于Qt::QueuedConnection方式,Qt元对象系统必须知道信号/槽的参数类型,否则的话编译器会报错“QObject::connect:Cannot queue arguments of type 'Type'”,想要使用类型Type必须首先通过qRegisterMetType()函数在元对象系统中注册(简单数据类型和Qt定义的数据类型无需注册,可直接使用)。
宏SIGNAL()和SLOT()返回其参数的C风格的字符串(const char *),因此下面关联信号和槽的两个语句是等同的:
connect(pushButton,SIGNAL(clicked()),this,SLOT(doPushButton()));
connect(pushButton,"clicked()",this,"doPushButton()");
Qt信号和槽机制的优点是:类型安全,松散耦合。
当某个事件出现时,通过发送信号,可以将与之相关联的槽函数激活,即执行槽函数代码。在程序中,使用QObject::connect()函数来讲某个信号和某个槽进行关联,而信号和槽之间的真正关联是由Qt的信号和槽机制来实现的。
信号和槽的关联关系可以有3种模式:
-〉一个信号和一个槽关联;
-〉一个信号和多个槽关联;
-〉多个信号和一个槽关联;
一个信号和多个槽关联的情况下,当发出该信号的时候,与该信号关联的各个槽以任意的先后顺序立即执行。信号和槽机制是完全独立于GUI事件循环的。
此外,信号还可以与信号进行关联。当两个信号关联时,第一个信号的发出将会激Qt发出第二个信号。
信号和槽机制通过QObject::connect(const QObject *sender,const char *signal,const QObject *receiver,const char*method,Qt::ConnectionType type=Qt::AutoCompatConnection)函数关联,参数type定义了信号与槽的关联方式,决定一个信号时立即传递到槽还是排队等待以后传递。
Qt使用了枚举类型Qt::ConnectionType定义了信号与槽的关联方式,有3种:
-〉Qt::DirectConnection,信号发送后立即传递给相关联的槽,只有槽函数执行完毕返回后,发送信号“emit<信号>”之后代码才被执行。
-〉Qt::QueuedConnection,信号发送后排队,直到事件循环(event loop)有能力将他传递给槽。而不管槽函数有没有执行,发送信号“emit<信号>”之后的代码都会立即得到执行。
-〉Qt::AutoConnection,如果信号和槽在同一个线程,信号发出后,槽函数将立即执行,等同于Qt::DirectConnection;如果信号和槽不在同一个线程,信号将排队,等待事件循环的处理,效果等同于Qt::QueuedConnection。
对于Qt::QueuedConnection方式,Qt元对象系统必须知道信号/槽的参数类型,否则的话编译器会报错“QObject::connect:Cannot queue arguments of type 'Type'”,想要使用类型Type必须首先通过qRegisterMetType()函数在元对象系统中注册(简单数据类型和Qt定义的数据类型无需注册,可直接使用)。
宏SIGNAL()和SLOT()返回其参数的C风格的字符串(const char *),因此下面关联信号和槽的两个语句是等同的:
connect(pushButton,SIGNAL(clicked()),this,SLOT(doPushButton()));
connect(pushButton,"clicked()",this,"doPushButton()");
Qt信号和槽机制的优点是:类型安全,松散耦合。