QSlider с текстом на отметках - PullRequest
1 голос
/ 02 апреля 2019

В моем приложении Qt есть несколько горизонтальных QSliders с отметками 4-5 тиков.Как я могу добавить QLabels над тиками ползунка, чтобы отразить значение на каждом из тиков?

Я подозреваю, что лучший способ сделать это - создать подкласс QSlider и переопределить метод paintEvent (), например этот ответ описывает.Но как бы я добавил QLabels в зависимости от положения тиков?

Для пояснения:

Я ищу текстовые метки на каждом тике, т.е. если у меня есть ползунок, который идет от 0 -100 с 4 тиками, тики будут иметь «0», «25», «50» и «100» над ними соответственно.Ваше решение все еще полезно, я думаю, что я должен быть в состоянии переработать его, используя this-> геометрию, чтобы получить координаты и разделить на число тактов (которое, я полагаю, я могу рассчитать с (max - min / tick interval)

1 Ответ

0 голосов
/ 02 апреля 2019

В 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)
}
...