Как изменить размер 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
Вот вывод::
Перед изменением размера
После изменения размера
1 ответ
причина
QGraphicsRectItem, который вы используете в качестве дескриптора, не знает об изменениях размера QDial, поэтому он не отвечает изменением своего размера.
ограничение
QWidget и его подклассы не предоставляют что-то вроде sizeChanged
сигнал из коробки.
Решение
Учитывая причину и данное ограничение, мое решение будет следующим:
- В подкалиссе QDial, скажем, Dial, добавьте новый сигнал
void sizeChanged();
- Переопределить
resizeEvent
Наберите как это:
в dial.cpp
void Dial::resizeEvent(QResizeEvent *event)
{
QDial::resizeEvent(event);
sizeChanged();
}
- + Изменить
auto *dial= new QDial();
вauto *dial= new Dial();
- Добавьте следующий код после
Scene->addItem(handle); // adding to scene
:
в том месте, где ваш пример кода
connect(dial, &Dial::sizeChanged, [dial, handle](){
handle->setRect(dial->geometry().adjusted(-10, -10, 10, 10));
});
Примечание. Эту проблему также можно решить, используя eventFilter вместо создания подкласса QDial. Однако из вашего другого вопроса я знаю, что вы уже подкласс QDial, поэтому я считаю предложенное решение более подходящим для вас.
Результат
Это результат предложенного решения: