将滑块valuechange()信号连接到标签几何

时间:2019-05-28 09:54:25

标签: c++ qt signals-slots qlabel qslider

我希望我的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)如果将滑块向左移动,如何使标签向左移动。 任何帮助表示赞赏。

1 个答案:

答案 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);
}