2011-02-25 2 views
0

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

+0

вы можете использовать setGeometry, а также изменить его положение в диалоговом окне ... – Mostafa

ответ

0

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

+0

Спасибо, но что такое self в QLabel.setIndent (self, int)? –

+0

Взгляните на документацию setIndent, в этом и других методах они используют self как первый параметр. Моя интерпретация заключается в том, что это неявный параметр, который задается получателем сообщения, как в Python. Поэтому я думаю, что это работает, если вы просто вызываете yourQLabel.setIndent (int). «yourQLabel» - это первый (неявный) параметр. –

2

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

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

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

Также вы можете попробовать этот путь (он будет 'двигаться' QLabel себя):

  1. Создание макета коробки (QHBoxLayout или QVBoxLayout).
  2. Добавить участок (звонок QBoxLayout::addStretch).
  3. Добавить QLabel (звонок QLayout::addWidget).
  4. Добавить еще раз.
  5. Затем вы можете изменить коэффициенты растяжения для имитации «move».

Начальное значение коэффициента растяжения будет определять начальное положение метки.

Код примера для имитации 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 для того, чтобы нарисовать какой-то ярлык над ползунком.

Смежные вопросы