作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经通过 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
最佳答案
用作句柄的 QGraphicsRectItem 不知道 QDial 的大小变化,因此它不会通过调整自身大小来响应。
QWidget 及其子类不提供开箱即用的 sizeChanged
信号之类的东西。
考虑到原因和给定的限制,我的解决方案如下:
void sizeChanged();
resizeEvent
:在拨号.cpp
void Dial::resizeEvent(QResizeEvent *event)
{
QDial::resizeEvent(event);
sizeChanged();
}
auto *dial= new QDial();
更改为 auto *dial= new Dial();
Scene->addItem(handle)之后添加如下代码;//添加到场景
:在你的示例代码所在的地方
connect(dial, &Dial::sizeChanged, [dial, handle](){
handle->setRect(dial->geometry().adjusted(-10, -10, 10, 10));
});
注意:这也可以使用 eventFilter 来解决而不是继承QDial。然而,从你的另一个question我知道您已经将 QDial 子类化,这就是为什么我发现建议的解决方案更适合您。
这是建议解决方案的结果:
关于c++ - 如何通过QGraphicsProxy调整QGraphicScene中添加的QWidget的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52024492/
我是一名优秀的程序员,十分优秀!