如何在 Qt 中判断 QSpinBox 是否被用户修改过

8

假设我有一个 QSpinBox,我如何找出值是由用户手动更改还是由其他函数更改的?

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


我有一些解决方案,但你需要澄清。你是否只想在用户更改值时执行某些操作,但如果你在程序中执行它(例如setValue),你不想执行这些操作。 - Jablonski
我看到了编辑,现在我可以发布我的答案,请检查一下。 - Jablonski
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"

另一种方法是提供一些布尔变量,并在setValue之前将其设置为true,然后在槽中检查此变量。如果是false(用户操作)-执行某些操作,否则不执行(将布尔值改为false)。优点:您不会阻止信号。缺点:可能会使代码难以阅读,如果槽被多次调用,则会多次执行此不必要的检查。


3
通常情况下,与输入相关的QWidgets没有用户和编程值设置的约定,这真是太遗憾了。 - Troyseph
2
现在,使用 RAII 的正确方法是使用 QSignalBlocker,而不是像您所做的那样“包围”您的 setValue - 0xC0000022L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接