Qt实现QSpinBox微调器和QSlider拖动条联合使用
QSpinBox和QSlider一起应用的场景非常多,而联合使用主要有两种情况,第一种情况也是最简单的情况QSpinBox和QSlider存的都是整型int
,想要联合使用可以直接使用他自己的槽方法,而第二种情况是小数问题(QSpinBox和QSlider拖动条显示小数)
,这就会稍微复杂一些了,看下面的例子吧👇
第一种情况:QSpinBox和QSplider都为整型int
QSpinBox* m_pAttachSpinBox = new QSpinBox(this);
QSlider* m_pAttachSlider = new QSlider(this);
m_pAttachSpinBox->setMinimum(-15);//设置最小值
m_pAttachSpinBox->setMaximum(15);//设置最大值
m_pAttachSpinBox->setSingleStep(1);//设置步长
m_pAttachSlider->setOrientation(Qt::Horizontal); //水平方向的拖动条
m_pAttachSlider->setMinimum(-15);// 最小值
m_pAttachSlider->setMaximum(15);// 最大值
m_pAttachSlider->setSingleStep(1);// 设置步长
// 连接信号槽(相互改变)
connect(m_pAttachSpinBox, SIGNAL(valueChanged(int)), m_pAttachSlider, SLOT(setValue(int)));
connect(m_pAttachSlider, SIGNAL(valueChanged(int)), m_pAttachSpinBox, SLOT(setValue(int)));
运行效果:
第二种情况:QSpinBox和QSplider都为需要显示小数
在这就不能用QSpinBox了,因为QSpinBox只能显示整数,所以得选用QDoubleSpinBox,而QSlider也没有针对小数的槽方法,那就得采用放大缩小的思想
,比如QDoubleSpinBox的范围是0.5-1.2,那么QSlider的范围就可以设置成5-12
,当QDoubleSpinBox改变数值时,QSlider放大10倍在QSlider中显示,同理当QSlider数值改变时,那么QDoubleSpinBox则缩小10倍,这个槽方法就得自己实现了,在这我使用Lambda表达式写槽方法,看下面例子👇
QDoubleSpinBox* m_pMaSpinBox = new QDoubleSpinBox(this);
m_pMaSpinBox->setMinimum(0.5); // 最小值
m_pMaSpinBox->setMaximum(1.2); //最大值
m_pMaSpinBox->setSingleStep(0.1);//步长
QSlider* m_pMaSlider = new QSlider(this);
m_pMaSlider->setOrientation(Qt::Horizontal);// 水平方向
m_pMaSlider->setMinimum(5); // 最小值
m_pMaSlider->setMaximum(12); // 最大值
m_pMaSlider->setSingleStep(1); // 步长
// 连接信号槽(相互改变)
connect(m_pMaSpinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), m_pMaSlider, [=](double v)
{
//放大10倍在QSlider中显示
m_pMaSlider->setValue(v * 10);
});
connect(m_pMaSlider, &QSlider::valueChanged, m_pMaSpinBox, [=](int v)
{
//缩小10倍在QDoubleSpinBox中显示
m_pMaSpinBox->setValue((double)v / 10);
});
运行效果: