Странное поведение Qt QSlider при смене виджета с помощью - PullRequest
1 голос
/ 11 апреля 2020

Я заметил странное поведение с QSlider, которое может воспроизводиться всякий раз, когда виджеты слайдера имеют разную ширину, например. быть изменен Это проблема с моими сигналами? если так, как бы я go об обновлении slider2, когда slider1 был обновлен, не влияя на ширину слайдера?

Visual:
the program

Проблема:

При изменении ширины ползунка1 перерисовывается ползунок2, чтобы он выглядел одинаково, но изменение положения ползунка 2 вручную покажет, что длина не изменилась, и это выглядит как сбой. Любые идеи, что здесь происходит, или если это ошибка?

Ожидаемое поведение:

Ползунки не должны иметь никакого отношения друг к другу в отношении их макета, единственное изменение, которое я ожидал увидеть , ручка перемещается на соответствующую позицию в виджете с измененным размером, а не на ту же самую позицию.

Фактическое поведение:

Ручка перемещается на ту же самую позицию на виджете, которому она сигнализирует, вместо позиции смещения, которая должна соответствовать его новой ширине.

Следующий пример был скомпилирован с использованием: Qt 5.12.3 для Ma c OS 10.14.5

Пример

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QHBoxLayout>
#include <QSlider>
#include <QMainWindow>
#include <QDebug>

#include <QDockWidget>

class DockSliderWidget : public QDockWidget
{
    Q_OBJECT

public:
    DockSliderWidget(QWidget* parent = nullptr)
        : QDockWidget(parent)
    {
        QWidget* container = new QWidget(this);
        QHBoxLayout* hBoxLayout = new QHBoxLayout();
        mSlider = new QSlider(Qt::Horizontal, this);

        mSlider->setMinimum(0);
        mSlider->setMaximum(100);

        connect(mSlider, &QSlider::valueChanged, this, &DockSliderWidget::valueChanged);
        hBoxLayout->addWidget(mSlider);
        container->setLayout(hBoxLayout);
        setWidget(container);
    }

    void changeValue(qreal value)
    {
        qDebug() << value;
        QSignalBlocker b(mSlider);
        mSlider->setValue(value);
    }

Q_SIGNALS:
    void valueChanged(qreal value);
private:

    QSlider* mSlider = nullptr;
};


class DockSliderWidget;

class Widget : public QMainWindow
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr)
        : QMainWindow(parent)
    {
        sliderWidget1 = new DockSliderWidget(parent);

        sliderWidget2 = new DockSliderWidget(parent);

        connect(sliderWidget1, &DockSliderWidget::valueChanged, sliderWidget2, &DockSliderWidget::changeValue);
        connect(sliderWidget2, &DockSliderWidget::valueChanged, sliderWidget1, &DockSliderWidget::changeValue);

        addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, sliderWidget1);
        addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, sliderWidget2);

    }

    ~Widget()
    {
    }

private:
    DockSliderWidget* sliderWidget1;
    DockSliderWidget* sliderWidget2;
};

#endif // WIDGET_H
...