Почему я не могу увеличить виджет, добавленный в QGraphicScene с помощью QSizeGrip? - PullRequest
0 голосов
/ 28 августа 2018

Я добавил виджет в графическую сцену QGraphicScene через QGraphicsProxyWidget. Чтобы переместить его, я установил QGraphicsRectitem в качестве его родителя. Размер виджета изменяется с использованием размерной ручки.

Когда я впервые создаю объект, я могу увеличить его до некоторого измерения. Во второй раз я могу увеличить его меньше, чем первый. В третий раз меньше второго и т. Д.

Мне кажется, что он ведет себя случайным образом. Почему это происходит?

Вот код:

void GraphicsView::dropEvent(QDropEvent *event)// subclass of QGraphicsView
{

  if(event->mimeData()->text() == "Dial")
  {
   auto *dial= new Dial;      // The widget
   auto *handle = new QGraphicsRectItem(QRect(event->pos().x(),event->pos().y(), 120, 120));    // Created to move and select on scene
   auto *proxy = new QGraphicsProxyWidget(handle); // Adding the widget through the proxy
   dial->setGeometry(event->pos().x()+10,event->pos().y()+10, 100, 100);
   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 

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

code

Я не могу увеличить виджет больше того, что показано на картинке.

1 Ответ

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

Ваш Циферблат не может быть изменен за правым (горизонтальным) и нижним (вертикальным) краями GraphicView. Если вы сделаете сцену достаточно большой, скажем, 2000x2000 (setSceneRect(2000, 2000);), появятся полосы прокрутки. Если вы передвинете полосы прокрутки вручную, вы сможете еще больше увеличить свои виджеты.

Вы также можете поэкспериментировать с автоматическим перемещением полосы прокрутки, изменив лямбда-функцию следующим образом:

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

    int dx = handle->rect().bottomRight().x() > viewport()->rect().bottomRight().x();
    int dy = handle->rect().bottomRight().y() > viewport()->rect().bottomRight().y();

    if (dx > 0) {
        horizontalScrollBar()->setValue(horizontalScrollBar()->value() + dx);
    }

    if (dy > 0) {
        verticalScrollBar()->setValue(verticalScrollBar()->value() + dy);
    }
});

Обратите внимание, что хотя этот код работает, он очень громоздок. Тем не менее, это может дать вам представление о том, как начать.

...