介绍
信号和插槽用于对象之间的通信。
在GUI编程中,当我们更改一个小部件时,我们经常需要通知另一个小部件。更一般地说,我们希望任何类型的对象能够彼此通信。例如,如果用户单击“ 关闭”按钮,我们可能希望调用窗口的close()函数。
运行机制
一个对象发出信号,另一个对象给出自己的插槽处理,其中slot的参数个数可少于sinal的参数个数,当然参数可以使用默认参数,as:change(int i=0);
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value)
{
if (value != m_value)
{
m_value = value;
//===========定义函数,发生将会发射sinal=======
emit valueChanged(value);
}
}
signals:
void valueChanged(int newValue,int oldvalue);
private:
int m_value;
};
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
QObject::connect(&ac, SIGNAL(valueChanged(int,int)),&bc, SLOT(setValue(int)));//can use a`s arguments bigger b`s arguments
connect(buttonGroup, QOverload<int, bool>::of(&QButtonGroup::buttonToggled),
[=](int id, bool checked){ /* ... */ });
//不用signal和slot的connect的写法,了解一下