Я заметил странное поведение с QSlider, которое может воспроизводиться всякий раз, когда виджеты слайдера имеют разную ширину, например. быть изменен Это проблема с моими сигналами? если так, как бы я go об обновлении slider2, когда slider1 был обновлен, не влияя на ширину слайдера?
Visual:
Проблема:
При изменении ширины ползунка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