本文概要:讲解Qt的信号与槽机制,涉及信号与槽的连接方法,连接条件等。
可以使用信号与槽机制的类:
信号与槽机制是在QObject类中实现的,这种机制能够用与任何QObject子类中,但是应该在类中加入Q_OBJECT宏。
槽的介绍:
槽与普通的c++成员函数几乎一样;槽能够被声明为虚函数,能被重载,能够被其他函数调用等,与c++普通
的成员函数不同之处仅仅在于槽可以与信号连接在一起,每当发射与槽可以接受的信号时,槽会被自动调用。
槽与信号的连接方法:
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
sender和receiver都应该为指向QObject的指针,signal与slot为不带参数的函数名;SIGNAL与SLOT宏会将它们的参数转换为相应的字符串。
槽与信号连接的可能情况:
一个信号连接多个槽:
connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int))); connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updataStatusBarIndicator(int)));
当发射信号时,会以不确定的顺序调用这些槽;
多个信号连接一个槽:
connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError())); connect(calculator, SIGNAL(divisionByZeor()), this, SLOT(handleMathError()));
无论发射那个信号都会调用连接的槽;
信号可以与另外一个信号连接:
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updataRecord(const QString &)));
当发射第一个信号时,第二个信号也会被发送,除此之外,信号的相互连接与信号与槽的连接难以区分。
信号与槽(或者信号)的连接可以被移除:
disconnect(lcd, SIGNAL(overflow( )), this, SLOT(handleMathError( )));
一般情况下较少用到。另外,当删除对象时,Qt会自动与这个对象相关的所有连接;
信号与槽(或者信号)成功连接的条件:
信号与槽的顺序必须有相同的顺序与相同的类型,如果信号的参数比它所连接的槽的参数多,多余的参数会被忽略。另外,在信号与槽使用connect()连接时,
信号与槽的名字中不能包含参数名。