2014-10-14 3 views
3

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

EDIT: Я хочу делать некоторые действия только тогда, когда пользователь меняет значения, но если ваша программа делает это (setValue), я не хочу делать эти действия.

+0

У меня есть какое-то решение, но вам нужно уточнить. Вы хотите выполнять некоторые действия только тогда, когда пользователь меняет значения, но если вы делаете это в своей программе (например, setValue), вы не хотите выполнять эти действия. – Chernobyl

+0

Я видел редактирование, теперь я могу опубликовать свой ответ, проверьте его, пожалуйста. – Chernobyl

ответ

8

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

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

+0

Очень стыдно, что входные связанные QWidgets в общем случае не имеют соглашения для пользовательских настроек программных значений ... – Troyseph

Смежные вопросы