我希望我的QLabel通过移动QSlider来更改其位置。 我将滑块 valueChanged 信号连接到可更改标签几何形状的插槽,如下所示:
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this, SLOT(ChangeLabelGeometry(int)));
void MeasuresWidget::ChangeLabelGeometry(int delta)
{
ui->NorthLabel->setGeometry(ui->NorthLabel->geometry().x()+delta,
ui->NorthLabel->geometry().y(),
ui->NorthLabel->geometry().width(),
ui->NorthLabel->geometry().height());
if(ui->NorthLabel->geometry().x()>=scrollArea->geometry().x()+scrollArea->geometry().width())
ui->NorthLabel->setGeometry(scrollArea->geometry().x(),ui->NorthLabel->geometry().y(),
ui->NorthLabel->geometry().width(),
ui->NorthLabel->geometry().height());
}
我还希望标签到达终点位置时返回其起始位置。它有效,但不符合预期。第一个问题是标签始终会移动不同的距离。我希望它保持在滑块下方。第二个问题是,如果我将滑块移到左侧,标签将全部移到右侧。正如我所说,我希望它保持在滑块下方。 因此,我的问题是: 1)如何确保滑块移动的距离等于滑块移动的距离; 2)如果将滑块向左移动,如何使标签向左移动。 任何帮助表示赞赏。
答案 0 :(得分:0)
基本问题是您将标签从其{em>当前位置移动了delta
。因此,即使滑块以恒定速率移动,它也会加速。您需要相对于标签的原始位置移动标签–在您的情况下为scrollArea->geometry().topLeft()
...
void MeasuresWidget::ChangeLabelGeometry (int delta)
{
/*
* Create a QRect representing the original -- untranslated -- geometry
* of the QLabel.
*/
auto new_geometry = QRect(scrollArea->geometry().topLeft(), ui->NorthLabel->size());
/*
* If translating the new geometry by delta would move it too far then
* leave new_geometry as it is. Otherwise translate it by delta.
*/
if (new_geometry.x() + delta < scrollArea->geometry().x() + scrollArea->geometry().width())
new_geometry.translate(delta, 0);
/*
* Update the label's geometry.
*/
ui->NorthLabel->setGeometry(new_geometry);
}