Как изменить размер QWidget, добавленного в QGraphicScene через QGraphicsProxy? - PullRequest
0 голосов
/ 26 августа 2018

Я добавил виджет в графическую сцену (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 

Вот выход ::
До изменения размера
Before Resize После изменения размера After Resize

1 Ответ

0 голосов
/ 26 августа 2018

Причина

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

Ограничение

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

Решение

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

  1. В подкалсе QDial , скажем Dial , добавьте новыйсигнал void sizeChanged();
  2. Переопределить 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 , поэтому я считаю предложенное решение более подходящим для вас.

Результат

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

before resize

after resize

...