Qt QLabel实现旋钮功能并实现超过范围后回弹
时间: 2024-03-07 20:50:09 浏览: 69
可以通过继承 QLabel 类并重写鼠标事件来实现旋钮功能,并在超过范围后回弹。
以下是一个简单的实现示例:
```cpp
class KnobLabel : public QLabel
{
public:
KnobLabel(QWidget *parent = nullptr) : QLabel(parent) {
setAlignment(Qt::AlignCenter);
setMouseTracking(true);
setFixedSize(50, 50);
setStyleSheet("QLabel {border-radius: 25px; border: 1px solid black;}");
m_value = 0;
m_minValue = 0;
m_maxValue = 100;
}
int value() const {
return m_value;
}
void setValue(int value) {
if (value < m_minValue) {
m_value = m_minValue;
} else if (value > m_maxValue) {
m_value = m_maxValue;
} else {
m_value = value;
}
setText(QString::number(m_value));
}
int minValue() const {
return m_minValue;
}
void setMinValue(int minValue) {
m_minValue = minValue;
}
int maxValue() const {
return m_maxValue;
}
void setMaxValue(int maxValue) {
m_maxValue = maxValue;
}
protected:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
m_lastPos = event->pos();
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
QPoint delta = event->pos() - m_lastPos;
int valueDelta = delta.y() / 10;
setValue(m_value - valueDelta);
m_lastPos = event->pos();
}
}
void mouseReleaseEvent(QMouseEvent *event) override {
Q_UNUSED(event);
if (m_value < m_minValue) {
setValue(m_minValue);
} else if (m_value > m_maxValue) {
setValue(m_maxValue);
}
}
private:
int m_value;
int m_minValue;
int m_maxValue;
QPoint m_lastPos;
};
```
在上面的代码中,我们继承了 QLabel 类,并重写了 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent 事件。在 mousePressEvent 中,我们记录了当前鼠标位置作为起始位置。在 mouseMoveEvent 中,我们计算出鼠标移动的距离,并将其转化为旋钮的值的变化量。在 mouseReleaseEvent 中,我们检查当前值是否超出了范围,并将其回弹到范围内。我们还定义了一些用于设置旋钮值和范围的公共函数。
使用时,可以将 KnobLabel 添加到窗口中,并设置旋钮的最小值、最大值和初始值:
```cpp
KnobLabel *knob = new KnobLabel(this);
knob->setMinValue(0);
knob->setMaxValue(100);
knob->setValue(50);
```
这样就可以在窗口中显示一个旋钮了。
阅读全文