Я добавил виджет в графическую сцену 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));});
} }
Я не могу увеличить виджет больше того, что показано на картинке.
Ваш Набирать номер не может быть изменен после правого (горизонтального) и нижнего (вертикального) краев GraphicView. Если вы сделаете сцену достаточно большой, скажем, 2000×2000 (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);
}
});
Обратите внимание, что хотя этот код работает, он очень громоздок. Тем не менее, это может дать вам представление о том, как начать.
Других решений пока нет …