Возможное решение:
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). Преимущества: вы не блокируете сигнал. Недостатки: возможно, жестко читаемый код, если слот звонит много раз, вы будете много времени делать эту ненужную проверку.
У меня есть какое-то решение, но вам нужно уточнить. Вы хотите выполнять некоторые действия только тогда, когда пользователь меняет значения, но если вы делаете это в своей программе (например, setValue), вы не хотите выполнять эти действия. – Chernobyl
Я видел редактирование, теперь я могу опубликовать свой ответ, проверьте его, пожалуйста. – Chernobyl