2

我通过 QGraphicsProxyWidget 向图形场景 (QGraphicScene) 添加了一个小部件。为移动和选择小部件添加了 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 

这是输出::调整大小
之前 调整大小
调整大小之前 之后 调整大小后

4

1 回答 1

2

原因

您用作句柄的QGraphicsRectItem不知道QDial的大小变化,因此它不会通过调整自身大小来响应。

局限性

QWidget及其子类不提供sizeChanged开箱即用的信号。

解决方案

考虑到原因和给定的限制,我的解决方案如下:

  1. 在 QDial 的子类中,比如说Dial,添加一个新信号void sizeChanged();
  2. 像这样重新resizeEvent实现Dial

在拨号.cpp

void Dial::resizeEvent(QResizeEvent *event)
{
    QDial::resizeEvent(event);

    sizeChanged();
}
  1. 更改auto *dial= new QDial();auto *dial= new Dial();
  2. 在后面添加以下代码Scene->addItem(handle); // adding to scene

在您的示例代码所在的地方

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

注意:这也可以使用eventFilter而不是继承 QDial来解决。但是,根据您的其他问题,我知道您已经将 QDial子类化,这就是为什么我发现建议的解决方案更适合您。

结果

这是建议的解决方案的结果:

调整大小之前

调整大小后

于 2018-08-26T13:39:40.223 回答