【Qt】2.2 继续了解信号和槽
槽和普通成员函数一样,可以是虚函数、被重载,可以是公有、私有、保护的。它可以被其它C++成员函数调用。
槽连接了信号,当发射这个信号时,槽会被自动调用。
连接函数:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection )
sender和receiver是指向QObject的指针。
signal和method是不带参数名的函数,需要使用宏SIGNAL()和SLOT()。
一个信号可以连接多个槽,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
connect(okButton, SIGNAL(clicked(bool)),
checkBox2, SLOT(click()));
当点击okButton时,checkBox1和checkBox2都会执行各自的槽click()。
多个信号可以连接同一个槽,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
connect(cancelButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
点击okButton或cancelButton时,checkBox1都会执行槽click()。
一个信号可以与另个一个信号连接,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
connect(cancelButton, SIGNAL(clicked(bool)),
okButton, SIGNAL(clicked(bool)));
当点击cancelButton时,会由okButton的信号clicked(bool)做响应,okButton会发射信号clicked(bool),从而checkBox1的槽click()会自动执行。
另外,cancelButton的信号clicked(bool)中的bool参数会传递给okButton的信号clicked(bool)中的bool参数。
在这里okButton的clicked(bool)信号被当作槽来使用,槽中有多少个参数,就会要求发射信号的函数至少要带有多少个参数,否则连接是不成功的。
连接可以被移除,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
disconnect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
当删除对象时,Qt会自动删除与这个对象相关的所有连接。
信号的参数数量至少是槽的参数数量。
1.例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
当发射信号时,信号的bool参数是没有用的。
2.例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(setHidden(bool));
当发射信号时,信号的bool参数会传递给槽的bool参数。
3.例如:
connect(checkBox1, SIGNAL(released()),
cancelButton, SLOT(setVisible(bool)));
这是错误的,槽要求一个bool参数,信号也必须有这一个bool参数。
4.例如:
connect(this, SIGNAL(send(bool, int, double)),
this, SLOT(recive(bool, int)));
信号的参数个数可以大于等于槽的参数个数,同时信号和槽的各个参数位置需要对应。
在这里,信号的第三个参数double类型不会被传递到槽。
在成员函数中手动发射信号,使用emit,例如:
在对象创建时,构造函数就已经连接了setVal信号和recive槽。
当对象调用SetValue()函数时,全发射setVal信号,同时传入相应的参数值,发射信号之后会由recive槽接收,设置val变量的值。
好咯,这一节的总结就到这里~