以《C++ GUI Programming with Qt 4, Second Edition》为参考
前几节提到过信号槽,此次来深入了解一下信号槽机制。
信号槽机制是Qt的一个基础,它使得程序员把一些对象绑定在一起,而对象之间无需知道他们的详细信息。
槽类似于C++中的成员函数,可以是虚拟的,可被重载,可声明为procted,private,public,可以像普通C++那样调用,参数可以是任何类型等。而唯一的不同就是槽可以与信号关联。
当某个事件发生时,通过发送信号,将与之关联的槽函数激活,执行槽代码。使用QObject::connect()将信号与槽进行关联。
connect()语句格式:
connect(sedner,SIGNAL(signal),receiver,SLOT(slot));
其中sender和receiver是QObject指针,signal和slot是参数名。
信号与槽关联的几种方式:
1.一个信号多个槽:
connect(slider, SIGNAL(valueChanged(int)),
spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)),
this, SLOT(updateStatusBarIndicator(int)));
当信号发送时,槽会以无序的方式调用
2.多个信号一个槽:
connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError())); connect(calculator, SIGNAL(divisionByZero()), this, SLOT(handleMathError()));
只要有一个信号发送,槽就会被调用
3.一个信号一个槽
4.信号与信号:
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));
当第一个信号发送时第二个信号也会发送,除此之外与信号槽是一样的。
5.关联可以移除:
disconnect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
通常这不是必须的,因为在对象删除时Qt会自动删除对象中的所有连接。
注意事项:
1.信号与槽的参数类型必须相同,而且顺序要一致
connect(ftp, SIGNAL(rawCommandReply(int, const QString &)), this, SLOT(processReply(int, const QString &)));
2.如果信号参数多于槽参数,那么多余的部分会忽略
connect(ftp, SIGNAL(rawCommandReply(int, const QString &)), this, SLOT(checkErrorCode(int)));
3.如果参数类型不一致,那么在编译或运行时会报错。
4.在类的开始加上Q_OBJECT这个宏,否则编译会出错。