Как изменить размер QWidget, добавленного в QGraphicScene через QGraphicsProxy?

Я добавил виджет в графическую сцену (QGraphicScene) через QGraphicsProxyWidget. Для перемещения и выбора виджета добавлен дескриптор QGraphicsRectItem.
Для изменения размера виджета добавлен QSizegrip к виджету. Но когда я изменяю размер виджета больше, чем прямоугольный элемент QGraphicsRect, правый и нижний края остаются позади. Как преодолеть эту проблему?
Когда я изменяю размер графического элемента виджета, должен изменяться размер прямоугольника или наоборот. как это сделать? Любые другие идеи приветствуются.
Вот код

     auto *dial= new QDial();                                        // The widget
auto *handle = new QGraphicsRectItem(QRect(0, 0, 120, 120));    // Created to move and select on scene
auto *proxy = new QGraphicsProxyWidget(handle);                 // Adding the widget through the proxy

dial->setGeometry(0, 0, 100, 100);
dial->move(10, 10);

proxy->setWidget(dial);

QSizeGrip * sizeGrip = new QSizeGrip(dial);
QHBoxLayout *layout = new QHBoxLayout(dial);
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(sizeGrip, 0, Qt::AlignRight | Qt::AlignBottom);

handle->setPen(QPen(Qt::transparent));
handle->setBrush(Qt::gray);
handle->setFlags(QGraphicsItem::ItemIsMovable |
QGraphicsItem::ItemIsSelectable);

Scene->addItem(handle); // adding to scene

Вот вывод ::
Перед изменением размера
Перед изменением размера
После изменения размера
После изменения размера

2

Решение

QGraphicsRectItem, который вы используете в качестве ручки, не знает об изменениях размера QDial, поэтому он не отвечает, изменяя размеры самого себя.

QWidget и его подпункты не обеспечивают что-то вроде sizeChanged сигнал из коробки.

Учитывая причину и данное ограничение, мое решение будет следующим:

  1. В подкальсе QDial, сказать Набирать номер, добавить новый сигнал void sizeChanged();
  2. Переопределить resizeEvent из Набирать номер как это:

в dial.cpp

void Dial::resizeEvent(QResizeEvent *event)
{
QDial::resizeEvent(event);

sizeChanged();
}
  1. + Изменить auto *dial= new QDial(); в auto *dial= new Dial();
  2. Добавьте следующий код после Scene->addItem(handle); // adding to scene:

в том месте, где ваш пример кода

connect(dial, &Dial::sizeChanged, [dial, handle](){
handle->setRect(dial->geometry().adjusted(-10, -10, 10, 10));
});

Замечания: Это также может быть решено с помощью eventFilter вместо подклассов QDial. Тем не менее, от вашего другого вопрос Я знаю что ты уже подкласс QDial, Вот почему я считаю предложенное решение более подходящим для вас.

Это результат предложенного решения:

перед изменением размера

после изменения размера

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]