Давайте предположим, что у меня есть QSpinBox
Как я могу узнать, если значение было изменено вручную от пользователя или из другой функции?
РЕДАКТИРОВАТЬ: Я хочу сделать некоторые действия только когда пользователь меняет значения, но если ваша программа делает это (setValue), я не хочу делать эти действия.
Возможное решение:
ui->spinBox->blockSignals(true);
ui->spinBox->setValue(50);
ui->spinBox->blockSignals(false);
В этом случае сигнал не будет излучаться, поэтому все, что вы можете поймать valueChanged()
сигнал — только действие пользователя.
Например:
void MainWindow::on_spinBox_valueChanged(int arg1)
{
qDebug() << "called";
}
Когда пользователь меняет значение мышью или вводит с клавиатуры, вы видите "called"
, но когда ты setValue
с блокирующими сигналами вы не видите "called"
,
Другой подход заключается в предоставлении некоторой переменной bool и установке ее на true
перед setValue
и проверьте эту переменную в слоте. Если это ложь (пользовательское действие) — выполнить какое-то действие, если нет — не делать (изменить bool на false). Преимущества: вы не блокируете сигнал. Недостатки: возможно, трудно читаемый код, если слот вызывает много раз, вы будете много раз делать эту ненужную проверку.