gpt4 book ai didi

c++ - 如何通过QGraphicsProxy调整QGraphicScene中添加的QWidget的大小?

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:27 24 4
gpt4 key购买 nike

我已经通过 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

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

最佳答案

原因

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

限制

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

解决方案

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

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

在拨号.cpp

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

sizeChanged();
}
  1. auto *dial= new QDial(); 更改为 auto *dial= new Dial();
  2. Scene->addItem(handle)之后添加如下代码;//添加到场景:

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

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

注意:这也可以使用 eventFilter 来解决而不是继承QDial。然而,从你的另一个question我知道您已经将 QDial 子类化,这就是为什么我发现建议的解决方案更适合您。

结果

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

before resize

after resize

关于c++ - 如何通过QGraphicsProxy调整QGraphicScene中添加的QWidget的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52024492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com