Динамическое изменение положения qlabel - PullRequest
0 голосов
/ 25 февраля 2011

Я новичок в программировании на QT, и у меня есть вопрос. У меня есть qslider и qlabel и играющее видео. Во время воспроизведения видео галочка qslider движется вперед, как вы можете догадаться. То, что я хочу сделать, это поместить qlabel прямо под галочкой qslider и перемещать его с галочкой, когда текст qlabel обновляется ...

Ответы [ 2 ]

2 голосов
/ 16 мая 2017

Вы не можете "перемещать" QLavel по всему виджету из-за системы разметки Qt : виджет существует внутри разметки. Поэтому, если вы хотите «переместить» свой ярлык только вертикально или горизонтально, есть несколько способов решить вашу проблему.

Самый простой способ - использовать функцию QLabel::setIndent (она будет «перемещать» текст внутри QLabel):

Если метка отображает текст, отступ применяется к левому краю, если alignment () - Qt :: AlignLeft, к правому краю, если alignment () - Qt :: AlignRight, к верхнему краю, если alignment () - Qt :: AlignTop и к нижнему краю, если alignment () имеет значение Qt :: AlignBottom.

Также вы можете попробовать этот способ (он «переместится» QLabel сам):

  1. Создание макета коробки (QHBoxLayout или QVBoxLayout).
  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, чтобы закрасить ползунок надписью.

0 голосов
/ 25 февраля 2011

Сначала вы можете попробовать QLabel.setIndent (self, int), вызывать его всякий раз, когда меняется тик. Если это работает для вас, это самая легкая возможность, если нет, пожалуйста, сделайте репост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...