我的Qt应用程序中有一些水平的QSliders,带有4-5个刻度线。如何在滑块刻度上方添加QLabel以反映每个刻度的值?
我怀疑最好的方法是创建QSlider的子类并覆盖this answer描述的paintEvent()方法。但是我如何根据刻度线的位置添加QLabels?
为澄清起见:
我正在寻找每个刻度线的文本标签,即,如果我有一个从0到100带有4个刻度线的滑块,则刻度线上方将有“ 0”,“ 25”,“ 50”和“ 100”他们分别。您的解决方案仍然有帮助,我相信我应该能够使用this-> geometry进行重新加工以获取坐标并除以刻度数(我相信我可以用(最大-最小/刻度间隔)进行计算
答案 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)
}