【问题标题】:QSlider with Text at the tick marks带有刻度线的 QSlider
【发布时间】:2019-08-23 23:26:09
【问题描述】:

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

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

澄清:

我正在寻找每个刻度处的文本标签,即如果我有一个从 0 到 100 的滑块,带有 4 个刻度,刻度将在上面有“0”、“25”、“50”和“100”他们分别。您的解决方案仍然有帮助,我相信我应该能够使用 this->geometry 来重做它以获取坐标并除以刻度数(我相信我可以用 (max - min/tick interval) 计算)

【问题讨论】:

  • 也许你会尝试在paintEvent'painter->drawText(..)`中使用而不是QLabel
  • @Simon 这似乎是一个更简单的解决方案。我会试试看。

标签: qt user-interface qslider


【解决方案1】:

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

【讨论】:

  • 有趣。我看到这是在写当前的 Slider 值,这不是我要找的。我正在寻找每个刻度的文本标签,即如果我有一个从 0 到 100 的滑块,带有 4 个刻度,刻度将分别在它们上方有“0”、“25”、“50”和“100” .您的解决方案仍然有帮助,我相信我应该能够使用 this->geometry 对其进行返工以获取坐标并除以刻度数(我相信我可以使用 (max - min/tick 间隔) 进行计算。
  • 这很有帮助,谢谢。我建议使用QPainter painter(this); 代替auto painter = new QPainter(this); 并将所有painter->[x] 替换为painter.[x],因为我收到大量错误消息QBackingStore::endPaint() called with active painter; did you forget to destroy it or call QPainter::end() on it?
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多