从自定义方法获取发射信号。连接 qSlider 和 qDoubleSpinBox
Get emitted signal from custom method. connect qSlider with qDoubleSpinBox
我想将 QDoubleSpinBox 与水平 QSlider 连接起来。我找到了足够多的例子,知道它们需要不同的参数类型(双精度与整数)。
我发现我可以使用新的 QT5 syntax:
连接它们
QObject::connect(ui->gammaSpinBox, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),ui->gammaHSlider, &QSlider::setValue);
QObject::connect(ui->gammaHSlider, &QSlider::sliderMoved,ui->gammaSpinBox, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::setValue));
我知道为了让这一切顺利,我需要通过单独的 SLOT/Method 将它们各自的参数转换为其他参数。因此,将 QSlider int 值设为双精度值 for example:
//connect gamma hSlider to function that will change value to double
QObject::connect(ui->gammaHSlider, SIGNAL(valueChanged(int)), this, SLOT(notifyValueChanged(int)));
void MainWindow::notifyValueChanged(int value){
double doubleValue = value / 10.0;
emit doubleValueChanged(doubleValue);
ui->statusbar->showMessage(QString::number(doubleValue));
}
我的问题...如何让 QDoubleSpinBox 接受这个新的转换值?我似乎无法理解如何从发出的信号 doubleValueChanged(doubleValue)
.
中获取值
有这样的正确方法吗?
QObject::connect(myQSlider, SIGNAL(doubleValueChanged(double)), myQDoubleSpinBox, SLOT(setValue(double)))
当我将所有这些放在一起时,QDoubleSpinBox 似乎会连接并同步到 QSlider 运动。但它只会显示其在 UI 编辑器中定义的值范围。
我需要我的双旋转框和滑块以 0.1 的增量从 0.8 增加到 4。
解决方案:
---在Ui编辑器中设置QDoubleSpinbox和QSlider的范围和步长如下:
滑块:
min: 8
max: 50
step: 1
value: 10
qDoubleSpinBox:
min: 0.8
max: 5.0
step: 0.1
value: 1.0
---将两个小部件信号连接到更新值的方法:
QObject::connect(ui->gammaHSlider, SIGNAL(valueChanged(int)),this,SLOT(sliderValueChanged(int)));
QObject::connect(ui->gammaSpinBox, SIGNAL(valueChanged(double)),this,SLOT(spinValueChanged(double)));
---更新滑块和 qdoublespinbox 值以匹配比例的函数。
void MainWindow::sliderValueChanged(int value){
double mIN = 0.8;
double mAX = 5.0;
double sTEP = 0.1;
ui->gammaHSlider->setMaximum(int (mAX/sTEP));
ui->gammaSpinBox->setDecimals(1);
ui->gammaSpinBox->setMinimum(mIN);
ui->gammaSpinBox->setMaximum(mAX);
double dVal = value*sTEP;
ui->gammaSpinBox->setValue(dVal);
ui->statusbar->showMessage(QString::number(value));
}
void MainWindow::spinValueChanged(double value){
int sVal = value*10;
ui->gammaHSlider->setValue(sVal);
ui->statusbar->showMessage(QString::number(value));
}
如果要控制QSlider中QDoubleSpinBox中显示的值从a到b,步长为s,则必须在QSlider中放置步数,同时配置显示的数字个数QDoubleSpinBox,除了它的最小值和最大值。
double m = 0.8;
double M = 4.0;
double s = 0.1;
myQSlider->setMaximum(int ((M-m)/s));
myQDoubleSpinBox->setDecimals(1);
myQDoubleSpinBox->setMinimum(m);
myQDoubleSpinBox->setMaximum(M);
connect(myQSlider, &QSlider::valueChanged, [=](int value){
double val = m + value*s;
myQDoubleSpinBox->setValue(val);
});
我想将 QDoubleSpinBox 与水平 QSlider 连接起来。我找到了足够多的例子,知道它们需要不同的参数类型(双精度与整数)。
我发现我可以使用新的 QT5 syntax:
连接它们QObject::connect(ui->gammaSpinBox, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),ui->gammaHSlider, &QSlider::setValue);
QObject::connect(ui->gammaHSlider, &QSlider::sliderMoved,ui->gammaSpinBox, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::setValue));
我知道为了让这一切顺利,我需要通过单独的 SLOT/Method 将它们各自的参数转换为其他参数。因此,将 QSlider int 值设为双精度值 for example:
//connect gamma hSlider to function that will change value to double
QObject::connect(ui->gammaHSlider, SIGNAL(valueChanged(int)), this, SLOT(notifyValueChanged(int)));
void MainWindow::notifyValueChanged(int value){
double doubleValue = value / 10.0;
emit doubleValueChanged(doubleValue);
ui->statusbar->showMessage(QString::number(doubleValue));
}
我的问题...如何让 QDoubleSpinBox 接受这个新的转换值?我似乎无法理解如何从发出的信号 doubleValueChanged(doubleValue)
.
有这样的正确方法吗?
QObject::connect(myQSlider, SIGNAL(doubleValueChanged(double)), myQDoubleSpinBox, SLOT(setValue(double)))
当我将所有这些放在一起时,QDoubleSpinBox 似乎会连接并同步到 QSlider 运动。但它只会显示其在 UI 编辑器中定义的值范围。
我需要我的双旋转框和滑块以 0.1 的增量从 0.8 增加到 4。
解决方案:
---在Ui编辑器中设置QDoubleSpinbox和QSlider的范围和步长如下:
滑块:
min: 8
max: 50
step: 1
value: 10
qDoubleSpinBox:
min: 0.8
max: 5.0
step: 0.1
value: 1.0
---将两个小部件信号连接到更新值的方法:
QObject::connect(ui->gammaHSlider, SIGNAL(valueChanged(int)),this,SLOT(sliderValueChanged(int)));
QObject::connect(ui->gammaSpinBox, SIGNAL(valueChanged(double)),this,SLOT(spinValueChanged(double)));
---更新滑块和 qdoublespinbox 值以匹配比例的函数。
void MainWindow::sliderValueChanged(int value){
double mIN = 0.8;
double mAX = 5.0;
double sTEP = 0.1;
ui->gammaHSlider->setMaximum(int (mAX/sTEP));
ui->gammaSpinBox->setDecimals(1);
ui->gammaSpinBox->setMinimum(mIN);
ui->gammaSpinBox->setMaximum(mAX);
double dVal = value*sTEP;
ui->gammaSpinBox->setValue(dVal);
ui->statusbar->showMessage(QString::number(value));
}
void MainWindow::spinValueChanged(double value){
int sVal = value*10;
ui->gammaHSlider->setValue(sVal);
ui->statusbar->showMessage(QString::number(value));
}
如果要控制QSlider中QDoubleSpinBox中显示的值从a到b,步长为s,则必须在QSlider中放置步数,同时配置显示的数字个数QDoubleSpinBox,除了它的最小值和最大值。
double m = 0.8;
double M = 4.0;
double s = 0.1;
myQSlider->setMaximum(int ((M-m)/s));
myQDoubleSpinBox->setDecimals(1);
myQDoubleSpinBox->setMinimum(m);
myQDoubleSpinBox->setMaximum(M);
connect(myQSlider, &QSlider::valueChanged, [=](int value){
double val = m + value*s;
myQDoubleSpinBox->setValue(val);
});