Иногда встречается ситуация, когда при смене значения в одном компоненте надо поменять значение в другом, и наоборот, например
C++ (Qt)
connect(spinbox1, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged1(int)));
connect(spinbox2, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged2(int)));
void MyClass::slotValueChanged1(int i)
{
spinbox2->setValue(i);
}
void MyClass::slotValueChanged2(int i)
{
spinbox1->setValue(i);
}
Если не предпринять дополнительных мер, то слоты будут бесконечно вызывать друг друга.
Очевидны два метода решения
Первый - использовать метод QObject::blockSignals
C++ (Qt)
void MyClass::slotValueChanged1(int i)
{
this->blockSignals(true);
spinbox2->setValue(i);
this->blockSignals(false);}
void MyClass::slotValueChanged2(int i)
{
this->blockSignals(true);
spinbox1->setValue(i);
this->blockSignals(false);
}
Считаю, что это плохое решение, т.к. блокируется весь механизм сигнал/слот, а не только те сигналы которые надо.
Другой вариант - ввести переменную, определяющую находимся ли мы уже внутри слота. Он не имеет недостатков первого метода, но имеет свои недостатки: много кода, на каждую пару слотов надо вводить отдельную переменную.
C++ (Qt)
bool in_slot=false;
void MyClass::slotValueChanged1(int i)
{
if(!in_slot)
{
in_slot=true;
spinbox2->setValue(i);
in_slot=false;
}
}
void MyClass::slotValueChanged2(int i)
{
if(!in_slot)
{
in_slot=true;
spinbox1->setValue(i);
in_slot=false;
}
}
Есть ли какое-то стандартное решение для такой ситуации, не имеющее недостатков указанных решений?