首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能扩大一个小部件添加到QGraphicScene通过QSizeGrip?

为什么我不能扩大一个小部件添加到QGraphicScene通过QSizeGrip?
EN

Stack Overflow用户
提问于 2018-08-28 14:56:03
回答 1查看 356关注 0票数 2

我已经通过一个QGraphicScene向图形场景QGraphicsProxyWidget添加了一个小部件。要移动它,我已经将QGraphicsRectitem设置为它的父级。小部件通过使用sizegrip来调整大小。

当我第一次创建一个物体时,我可以把它放大到某个维度。第二次我可以把它放大比第一次小。第三次少于第二次,依此类推。

在我看来,它的行为是随机的。为什么会发生这种情况?

以下是代码:

代码语言:javascript
复制
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));}); 
  }  }  

我不能再放大小部件了,在图像中所显示的内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-29 15:03:31

您的拨号不能调整大小通过图形视图的右边(水平)和底部(垂直)边缘。如果您使场景足够大,比如2000 x 2000 (setSceneRect(2000, 2000);),滚动条就会出现。如果您手动移动滚动条,您将能够扩大您的小部件更多。

您还可以通过更改lambda函数来尝试自动滚动条运动,如下所示:

代码语言:javascript
复制
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);
    }
});

请注意,虽然这段代码可以工作,但是非常麻烦。然而,它可以给你一个如何开始的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52060862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档