7

假设我有一个QSpinBox,我如何才能确定该值是从用户手动更改还是从其他函数更改的?

编辑:我只想在用户更改值时执行一些操作,但如果您的程序执行此操作(setValue),我不想执行此操作。

4

1 回答 1

14

可能的解决方案:

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 变量并将其设置为在 slottrue之前并检查此变量。setValue如果它是假的(用户操作) - 做一些动作,如果不是 - 不要做(将 bool 更改为假)。优点:不阻塞信号。缺点:可能代码难以阅读,如果槽调用多次,你会多次做这种不必要的检查。

于 2014-10-14T11:07:32.087 回答