QSlider带有刻度线的Text

时间:2019-04-02 15:13:03

标签: qt user-interface qslider

我的Qt应用程序中有一些水平的QSliders,带有4-5个刻度线。如何在滑块刻度上方添加QLabel以反映每个刻度的值?

我怀疑最好的方法是创建QSlider的子类并覆盖this answer描述的paintEvent()方法。但是我如何根据刻度线的位置添加QLabels?

为澄清起见:

我正在寻找每个刻度线的文本标签,即,如果我有一个从0到100带有4个刻度线的滑块,则刻度线上方将有“ 0”,“ 25”,“ 50”和“ 100”他们分别。您的解决方案仍然有帮助,我相信我应该能够使用this-> geometry进行重新加工以获取坐标并除以刻度数(我相信我可以用(最大-最小/刻度间隔)进行计算

1 个答案:

答案 0 :(得分:0)

PySide中有一个可以正常运行的实现。它显示每个刻度的四舍五入值,您可以通过更新QPainter::drawText回调函数将其替换为所需的任何文本。

很久以前,我确实将该代码移植到C ++。这是有趣的部分:

void MySlider::painEvent(...) {
    QSlider::paintEvent(self, event)

    auto round_value = std::floor(value());

    auto painter = new QPainter(this);
    painter->setPen(QPen(Qt::white));

    auto font_metrics = QFontMetrics(this->font());
    auto font_width = font_metrics.boundingRect(QString::number(round_value)).width();
    auto font_height = font_metrics.boundingRect(QString::number(round_value)).height();


    auto rect = w.geometry();
    if (this->orientation() == Qt::Horizontal) {
        auto horizontal_x_pos = rect.width() - font_width - 5;
        auto horizontal_y_pos = rect.height() * 0.75;
        painter->drawText(QPoint(horizontal_x_pos, horizontal_y_pos), 
                          QString::number(round_value));

    } else if (this->orientation() == Qt::Vertical) {
        auto vertical_x_pos = rect.width() - font_width - 5;
        auto vertical_y_pos = rect.height() * 0.75;
        painter->drawText(QPoint(rect.width() / 2.0 - font_width / 2.0, rect.height() - 5), 
                          QString::number(round_value));
    } else {
        return;
    }

    painter->drawRect(rect)
}