QT 不通过继承qslider,怎么自己画拖动条
时间: 2024-03-01 12:54:25 浏览: 101
如果您不想通过继承`QSlider`来自定义拖动条,可以通过继承`QWidget`并使用`QPainter`类来手动绘制。具体步骤如下:
1. 创建一个继承自`QWidget`的类,例如`CustomSlider`。
2. 在`CustomSlider`的构造函数中设置一些必要的属性,例如拖动条的最小值、最大值和当前值。
3. 重写`paintEvent`函数,在该函数中使用`QPainter`类来手动绘制拖动条。
4. 重写`mousePressEvent`和`mouseMoveEvent`函数,以便用户可以通过鼠标拖动手柄来改变当前值。
以下是一个示例实现:
```cpp
class CustomSlider : public QWidget {
Q_OBJECT
public:
CustomSlider(QWidget *parent = nullptr)
: QWidget(parent), m_minValue(0), m_maxValue(100), m_currentValue(50) {}
void setRange(int minValue, int maxValue) {
m_minValue = minValue;
m_maxValue = maxValue;
update();
}
void setValue(int value) {
m_currentValue = qBound(m_minValue, value, m_maxValue);
update();
}
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制滑轨
QRectF trackRect(0, height() / 2 - 2, width(), 4);
painter.setPen(QPen(Qt::gray, 4));
painter.drawLine(trackRect.topLeft(), trackRect.topRight());
// 绘制已选择的部分
QRectF selectedRect(0, height() / 2 - 2, width() * (m_currentValue - m_minValue) / (m_maxValue - m_minValue), 4);
painter.setPen(QPen(Qt::blue, 4));
painter.drawLine(selectedRect.topLeft(), selectedRect.topRight());
// 绘制手柄
QRectF handleRect(selectedRect.right() - 8, height() / 2 - 12, 16, 24);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::white);
painter.drawEllipse(handleRect);
painter.setBrush(Qt::gray);
painter.drawEllipse(handleRect.adjusted(2, 2, -2, -2));
}
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
setValue(m_minValue + (m_maxValue - m_minValue) * event->pos().x() / width());
event->accept();
} else {
event->ignore();
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
setValue(m_minValue + (m_maxValue - m_minValue) * event->pos().x() / width());
event->accept();
} else {
event->ignore();
}
}
private:
int m_minValue;
int m_maxValue;
int m_currentValue;
};
```
在上面的示例中,我们通过重写`paintEvent`函数来手动绘制滑轨、已选择的部分和手柄。然后,在`mousePressEvent`和`mouseMoveEvent`函数中处理鼠标事件,以便用户可以通过鼠标拖动手柄来改变当前值。
阅读全文