为 QDoubleSpinBox 的多个实例创建一个公共插槽

Creating a common slot for multiple instances of QDoubleSpinBox

我正在尝试创建一个可以接收 int 并将其作为 double 传递给 QDoubleSpinBox.SetValue(double); 的自定义插槽 但是我的 UI 中有一堆旋转框,所以我希望有一个插槽可以将 DoubleSpinBox 指针作为参数,如下所示:

void MainWindow::ConvertSetSpinBoxValue(int value, QDoubleSpinBox * spinbox)
{
    double ValToDouble = value;
    spinbox->setValue(ValToDouble);
}

然后我可以连接一个发出 Int 返回信号的小部件,即 QSlider:

connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(ConvertSetSpinBoxValue(int, ui->doubleSpinBox)));

可以重复此连接,我只需更改旋转框指针即可。但这不起作用,连接在编译时被丢弃。 任何的想法?谢谢!

使用新的 Qt5 signal/slot 语法允许您连接到可以捕获 QDoubleSpinBox *(未测试)...

的 lambda
auto *sb = ui->doubleSpinBox;
connect(ui->horizontalSlider, &QAbstractSlider::valueChanged, this,
        [this, sb](int value)
        {
            this->ConvertSetSpinBoxValue(value, sb);
        });
connect(ui->horizontalSlider, &QSlider::valueChanged, 
[this] (int value) { 
    ConvertSetSpinBoxValue(value, ui->doubleSpinBox); 
});
  1. 请使用现代语法进行连接
  2. lambda 应该能帮到你

正如其他人指出的那样,使用(新的)Qt5 信号和槽(使用函数指针和 lambda 函数)应该可以解决您的问题。

存在不同的方法:

  1. 使用 lambda 函数:

    connect(ui->horizontalSlider, &QSlider::valueChanged, this /*context*/, [this] (int value) {ui->doubleSpinBox->setValue(value);});
    

    注意 context 很有用,因为它会在上下文被破坏时自动破坏连接,但这里可能不需要它,因为 ui->horizontalSlider 可能会首先被破坏。

  2. 使用std::bind:

    connect(ui->horizontalSlider, &QSlider::valueChanged, this /*context*/, std::bind(&MainWindow::ConvertSetSpinBoxValue, this, value, ui->doubleSpinBox));
    
  3. 在signals/slots:

    之间使用隐式转换
    connect(ui->horizontalSlider, &QSlider::valueChanged, ui->doubleSpinBox, &QDoubleSpinBox::SetValue);
    

    请注意,新的信号和槽机制允许信号和槽之间的隐式转换。

参考资料