Вы не можете "перемещать" QLavel по всему виджету из-за системы разметки Qt : виджет существует внутри разметки.
Поэтому, если вы хотите «переместить» свой ярлык только вертикально или горизонтально, есть несколько способов решить вашу проблему.
Самый простой способ - использовать функцию QLabel::setIndent
(она будет «перемещать» текст внутри QLabel
):
Если метка отображает текст, отступ применяется к левому краю, если alignment () - Qt :: AlignLeft, к правому краю, если alignment () - Qt :: AlignRight, к верхнему краю, если alignment () - Qt :: AlignTop и к нижнему краю, если alignment () имеет значение Qt :: AlignBottom.
Также вы можете попробовать этот способ (он «переместится» QLabel
сам):
- Создание макета коробки (
QHBoxLayout
или QVBoxLayout
).
- Добавить растяжку (вызов
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
, чтобы закрасить ползунок надписью.