我是QT编程的新手,我有一个问题。我有一个qslider和qlabel和一个视频播放。在播放视频时,您可以猜到qslider的滴答声正在前进。我想做的是将一个qlabel放在qslider的刻度下面,并随着它的刻度移动它。

最佳答案

由于Qt layout system,您无法在整个窗口小部件上“移动” QLavel:窗口小部件位于布局内。
因此,如果您只想在垂直方向上“移动”标签,则几乎没有办法解决问题。

最简单的方法是使用QLabel::setIndent函数(它将“移动” QLabel中的文本):


  如果标签显示文本,则如果alignment()为Qt :: AlignLeft,则缩进将应用于左侧;如果alignment()为Qt :: AlignRight,则缩进至右侧;如果alignment()为Qt :: AlignTop,则缩进至顶部,如果alignment()为Qt :: AlignBottom,则返回底部边缘。


您也可以尝试这种方式(它将“移动” QLabel本身):


创建框布局(QHBoxLayoutQVBoxLayout)。
添加拉伸(调用QBoxLayout::addStretch)。
添加QLabel(调用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,以便在滑块上绘制一些标签。

关于c++ - 动态更改qlabel的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5116664/

10-16 00:56