c++ - 从自定义方法获取发射信号。连接 qSlider 和 qDoubleSpinBox

标签 c++ qt qt5 qt-signals qslider

我想将 QDoubleSpinBox 与水平 QSlider 连接起来。我找到了足够多的例子,知道它们需要不同的参数类型( double 与整数)。

我发现我可以使用新的 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/方法将它们各自的参数转换为其他参数。因此,将 QSlider int 值设为 double 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 编辑器中显示其定义的值范围。

我需要我的双旋转框和 slider 以 0.1 的增量从 0.8 增加到 4。


解决方案:

---在Ui编辑器中设置QDoubleSpinbox和QSlider的范围和步长如下:

slider :

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)));

---更新 slider 和 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);
});

关于c++ - 从自定义方法获取发射信号。连接 qSlider 和 qDoubleSpinBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298441/

相关文章:

c++ - QFileDialog:保存文件时自动添加扩展名?

c++ - Qt工程文件: Multiple platforms with debug and release

qt - 是否可以删除 Weston 工具栏?

qt - 你可以设置一个 QWidget 来占据 QTreeWidget 的整个列吗?

c++ - 这是我想使用 "using"的情况吗?

c++ - 如何修改文本文件的 "Date modified"属性而不影响使用 C++ 的内容?

c++ - 如何在 C++ 中将一个矩阵存储在另一个矩阵的一行中?

c++ - QT,运行特定时间的功能

c++ - 从表格中的坐标用 QVector 填充 QScatterDataArray

c++ - 如何防止 Qt 中的 currentCellChanged 信号或跳过 "processing"?