Qt узнать, был ли QSpinBox изменен пользователем

Предположим, у меня есть QSpinBox, как я могу узнать, было ли значение изменено вручную пользователем или другой функцией?

РЕДАКТИРОВАТЬ: я хочу выполнять некоторые действия только тогда, когда пользователь изменяет значения, но если ваша программа делает это (setValue), я не хочу выполнять эти действия.


person Matthias    schedule 14.10.2014    source источник
comment
У меня есть какое-то решение, но вам нужно уточнить. Вы хотите выполнять некоторые действия только тогда, когда пользователь изменяет значения, но если вы делаете это в своей программе (например, setValue), вы не хотите выполнять эти действия.   -  person Kosovan    schedule 14.10.2014
comment
Я видел редактирование, теперь я могу опубликовать свой ответ, проверьте его, пожалуйста.   -  person Kosovan    schedule 14.10.2014


Ответы (1)


Возможное решение:

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".

Другой подход состоит в том, чтобы предоставить некоторую логическую переменную и установить ее в true перед setValue и проверить эту переменную в слоте. Если ложно(действие пользователя) - делаем какое-то действие, если нет - не делаем(меняем bool на false). Преимущества: вы не блокируете сигнал. Недостатки: может быть плохо читаемый код, если слот вызывается много раз, вы много раз будете делать эту ненужную проверку.

person Kosovan    schedule 14.10.2014
comment
Это такой позор, что QWidget, связанные с вводом, в целом не имеют соглашения о настройке пользовательских и программных значений... - person Troyseph; 26.04.2016
comment
В наши дни QSignalBlocker было бы правильным способом (используя RAII), вместо того, чтобы окружать ваш setValue так, как вы это сделали. - person 0xC0000022L; 04.11.2020