【发布时间】:2017-05-16 18:14:30
【问题描述】:
我是 QT 编程的新手,我有一个问题。我有一个 qslider 和 qlabel 以及一个视频播放。在播放视频时,qslider 的滴答声正在向前移动,您可以猜到。我想要做的是将一个 qlabel 放在 qslider 的勾号下,并随着 qlabel 的文本更新而随着勾号移动它......
【问题讨论】:
-
你也可以使用 setGeometry 来改变它在对话框中的位置...
我是 QT 编程的新手,我有一个问题。我有一个 qslider 和 qlabel 以及一个视频播放。在播放视频时,qslider 的滴答声正在向前移动,您可以猜到。我想要做的是将一个 qlabel 放在 qslider 的勾号下,并随着 qlabel 的文本更新而随着勾号移动它......
【问题讨论】:
由于Qt layout system,您不能在整个小部件上“移动”QLavel:小部件存在于布局中。 因此,如果您只想垂直或水平地“移动”标签,则解决问题的方法很少。
最简单的方法是使用QLabel::setIndent 函数(它将“移动”QLabel 内的文本):
如果标签显示文本,如果alignment()是Qt::AlignLeft,缩进适用于左边缘,如果alignment()是Qt::AlignRight,则适用于右边缘,如果alignment()是Qt,则适用于上边缘::AlignTop,如果alignment()是Qt::AlignBottom,则到底部边缘。
您也可以尝试这种方式(它会“移动”QLabel 本身):
QHBoxLayout 或 QVBoxLayout)。QBoxLayout::addStretch)。QLayout::addWidget)。初始拉伸因子的值将定义标签的初始位置。
模拟QLabel左右移动的代码示例:
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget* parent) : QWidget(parent)
{
layout_ = new QHBoxLayout(this);
layout_->addStretch();
layout_->addWidget(new QLabel("Moving text", this));
layout_->addStretch(100);
connect(&timer_, SIGNAL(timeout()), SLOT(moveLabel()));
timer_.start(1000);
}
public slots:
void moveLabel()
{
layout_->setStretch(0, layout_->stretch(0) + 1);
layout_->setStretch(1, layout_->stretch(1) - 1);
if(layout_->stretch(0) == 100)
timer_.stop();
}
private:
QBoxLayout* layout_;
QTimer timer_;
};
根据您的情况,另一个变体是继承 QSlider,然后重新实现受保护的函数 QWidget::paintEvent,以便在滑块上绘制一些标签。
【讨论】:
首先您可以尝试 QLabel.setIndent(self, int),每当刻度发生变化时调用它。如果这对您有用,这是最简单的方法,如果没有,请重新发布。
【讨论】: