【问题标题】:Changing the position of qlabel dynamically动态改变 qlabel 的位置
【发布时间】:2017-05-16 18:14:30
【问题描述】:

我是 QT 编程的新手,我有一个问题。我有一个 qslider 和 qlabel 以及一个视频播放。在播放视频时,qslider 的滴答声正在向前移动,您可以猜到。我想要做的是将一个 qlabel 放在 qslider 的勾号下,并随着 qlabel 的文本更新而随着勾号移动它......

【问题讨论】:

  • 你也可以使用 setGeometry 来改变它在对话框中的位置...

标签: c++ qt


【解决方案1】:

由于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. 然后您可以更改“移动”模仿的拉伸因子。

初始拉伸因子的值将定义标签的初始位置。

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

【讨论】:

    【解决方案2】:

    首先您可以尝试 QLabel.setIndent(self, int),每当刻度发生变化时调用它。如果这对您有用,这是最简单的方法,如果没有,请重新发布。

    【讨论】:

    • 谢谢,但是 QLabel.setIndent(self, int) 中的 self 是什么?
    • 看看 setIndent 的文档,在这个和其他方法中,他们使用 self 作为第一个参数。我的解释是,这是一个隐式参数,由消息的接收者给出,就像在 Python 中一样。所以我认为如果你只调用 yourQLabel.setIndent(int) 就可以了。 “yourQLabel”是第一个(隐式)参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多