动态更改qlabel的位置

时间:2011-02-25 11:27:50

标签: c++ qt

我是QT编程的新手,我有一个问题。我有一个qslider和qlabel以及一个视频播放。在播放视频时,qslider的标记正在向前推进,您可以猜到。我想要做的是在qslider的勾号下放置一个qlabel,并在qlabel的文本正在更新的时候用勾号移动它......

2 个答案:

答案 0 :(得分:2)

由于Qt layout system,您无法在整个窗口小部件中“移动”QLavel:窗口小部件存在于布局中。 因此,如果您只想垂直横向移动标签,那么解决问题的方法很少。

最简单的方法是使用QLabel::setIndent功能(它会在QLabel内“移动”文字):

  

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

你也可以尝试这种方式(它将'移动'QLabel本身):

  1. 创建框布局(QHBoxLayoutQVBoxLayout)。
  2. 添加一段(调用QBoxLayout::addStretch)。
  3. 添加QLabel(调用QLayout::addWidget)。
  4. 再次添加一个拉伸。
  5. 然后你可以改变'move'模仿的拉伸因子。
  6. 初始伸展因子的值将定义标签的初始位置。

    模拟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,以便在滑块上绘制一些标签。

答案 1 :(得分:0)

首先你可以尝试QLabel.setIndent(self,int),每当tick变化时调用它。如果这对您有用,那么这是最简单的可能性,如果不是,请重新发布。