原创 QT第三站 深入信号和槽

2011-1-22 11:28 2803 3 3 分类: MCU/ 嵌入式

信号和槽机制是Qt编程的基础。他可以让应用程序编程人员把这些互不了解的对象绑定在一起。前面已经把一些信号与槽连接在一起了,也声明了自己的信号和槽,还实现了槽自己,并且还发射了自己的信号。

 

槽和普通的C++成员函数几乎是一样的,可以是虚函数,可以被重载,可以是公有的,保护的,或者是私有的,并且也可以被其他的C++成员函数调用,还可以是任意类型的,唯一不用的是,槽还可以和信号连接在一起,在这个情况下,每当发射这个信号的时候,就会自动调用这个槽。

 

connect()语句看起来会是如下的样子。

connect(sender,SIGNAL(signal),receiver,SLOT(slot));这里的sender和receiver是指向QObject的指针,signal和slot是不带参数的函数名。实际上,SIGNAL()宏和SLOT()宏会把他们的参数转换成相应的字符串。

到目前为止,我们已经把不同的信号和不同的槽连接在一起,但这里还需考虑一些其他的可能性。

**一个信号可以连接多个槽

connect(slider,SIGNAL(valueChanged(int)),

              spinBox,SLOT(setValue(int)));

connect(spinBox,SIGNAL(valueChanged(int)),

              slider,SLOT(setValue(int)));

在发射这个信号的时候,会不确定的顺序一个接一个地调用这个槽。

 

**多个信号可以连接同一个槽。

connect(lcd,SIGNAL(overflow()),

              this,SLOT(handleMathErro()));

connect(calculator,SIGNAL(divisionByZero()),

              this,SLOT(handleMathErro()));

无论发射那个信号,都会调用这个槽。

 

**一个信号可以与另外一个信号连连接。

connect(lineEdit,SIGNAL(textChanged(const QString &),this,SIGNAL(updateRecord(const QString &))));

当发射第一个信号时,也会发射第二个信号,除此之外,信号与信号之间的连接和信号与槽之间的连接时难以区分的。

 

**连接可以被移除

disconnect(lcd,SIGNAL(overflow()),

              this,SLOT(handleMathErro()));

这种情况很少用,因为的当删除对象是,qt会自动移除和这个对象的相关的所有连接。

 

要把信号成功连接到槽,他们的参数必须具有相同的顺序和相同的类型。

connect(ftp,SIGNAL(rawCommandReply(int,consnt Qstring &)),this,SLOT(processReply(int,consnt Qstring &)));

这里有个例外,如果信号的参数比他所连接的槽的参数那么多,那么多余的参数将会被简单的忽略掉,Qt运行时会发出警告。

到现在为止,我们仅仅在窗口部件之间使用了信号好槽,但是这种机制本身是在QObject中实现的,并不只局限于图形用户界面编程中。这种机制可以用于任何QObject的子类中。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条