Фон
Ваш QGraphicsWidget должен знать о двух вещах:
- При добавлении в сцену
Для этого вам нужно переопределить QGraphicsWidget::itemChange
и искать изменение типа QGraphicsItem::ItemSceneHasChanged
.
- Когда размер этой сцены изменяется
Это можно сделать, подключив слот или лямбда-функцию к сигналу QGraphicsScene::sceneRectChanged
.
Решение
Исходя из приведенного объяснения, мое решение будет следующим:
В RectangleWidget.h после QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override;
добавить:
protected:
QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
private:
QSize m_rectSize;
В RectangleWidget.cpp изменить return QSizeF(200, 200);
на return m_rectSize;
и добавить в конце:
QVariant RectangleWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
if (change == ItemSceneHasChanged) {
connect(value.value<QGraphicsScene *>(), &QGraphicsScene::sceneRectChanged, [this](const QRectF &rect){
m_rectSize.setWidth(rect.size().width());
m_rectSize.setHeight(rect.size().height());
});
}
return QGraphicsWidget::itemChange(change, value);
}
Наконец, в MainWindow.cpp после m_scene->addItem(m_rectangleWidget);
установите sceneRect
следующим образом:
m_scene->setSceneRect(0, 0, 100, 400);
Примечание: Прямоугольник будет реагировать на изменения сцены, а не на вид. Поэтому, если вы измените размер окна, размер прямоугольника не изменится.
Настройка
Это сделает прямоугольник точно такого же размера, что и сцена. Если вы хотите другое соотношение, скажем 0.5
вместо m_rectSize.setWidth(rect.size().width());
напишите m_rectSize.setWidth(rect.size().width() / 2);
соответственно m_rectSize.setHeight(rect.size().height() / 2);
.