假设我有一个 QSpinBox
,我如何找出值是由用户手动更改还是由其他函数更改的?
编辑:我想在用户更改值时执行一些操作,但如果您的程序(使用setValue)更改了它,我不想执行这些操作。
可能的解决方案:
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)。优点:您不会阻止信号。缺点:可能会使代码难以阅读,如果槽被多次调用,则会多次执行此不必要的检查。
QSignalBlocker
,而不是像您所做的那样“包围”您的 setValue
。 - 0xC0000022L