信号和槽机制是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的子类中。
文章评论(0条评论)
登录后参与讨论