为 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);
});
- 请使用现代语法进行连接
- lambda 应该能帮到你
正如其他人指出的那样,使用(新的)Qt5 信号和槽(使用函数指针和 lambda 函数)应该可以解决您的问题。
存在不同的方法:
使用 lambda 函数:
connect(ui->horizontalSlider, &QSlider::valueChanged, this /*context*/, [this] (int value) {ui->doubleSpinBox->setValue(value);});
注意 context 很有用,因为它会在上下文被破坏时自动破坏连接,但这里可能不需要它,因为 ui->horizontalSlider
可能会首先被破坏。
使用std::bind
:
connect(ui->horizontalSlider, &QSlider::valueChanged, this /*context*/, std::bind(&MainWindow::ConvertSetSpinBoxValue, this, value, ui->doubleSpinBox));
在signals/slots:
之间使用隐式转换
connect(ui->horizontalSlider, &QSlider::valueChanged, ui->doubleSpinBox, &QDoubleSpinBox::SetValue);
请注意,新的信号和槽机制允许信号和槽之间的隐式转换。
参考资料
我正在尝试创建一个可以接收 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 *
(未测试)...
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);
});
- 请使用现代语法进行连接
- lambda 应该能帮到你
正如其他人指出的那样,使用(新的)Qt5 信号和槽(使用函数指针和 lambda 函数)应该可以解决您的问题。
存在不同的方法:
使用 lambda 函数:
connect(ui->horizontalSlider, &QSlider::valueChanged, this /*context*/, [this] (int value) {ui->doubleSpinBox->setValue(value);});
注意 context 很有用,因为它会在上下文被破坏时自动破坏连接,但这里可能不需要它,因为
ui->horizontalSlider
可能会首先被破坏。使用
std::bind
:connect(ui->horizontalSlider, &QSlider::valueChanged, this /*context*/, std::bind(&MainWindow::ConvertSetSpinBoxValue, this, value, ui->doubleSpinBox));
在signals/slots:
之间使用隐式转换connect(ui->horizontalSlider, &QSlider::valueChanged, ui->doubleSpinBox, &QDoubleSpinBox::SetValue);
请注意,新的信号和槽机制允许信号和槽之间的隐式转换。
参考资料