我们有QWidget
由addWidget
添加到场景中。我们希望在切换到不同场景时保持显示。我们的方法是暂时将其从场景中移除removeItem
,切换到另一个场景后,我们会调用addWidget
重新添加它。但是,第二个addWidget
会引发错误:
QGraphicsProxyWidget::setWidget: cannot embed widget 0x7835ec8; already embedded
错误可以通过以下代码重现:
QWidget *widget = new QWidget;
scene->addWidget(widget);
scene->removeItem(widget->graphicsProxyWidget());
scene->addWidget(widget);
似乎removeItem
并未真正删除嵌入状态。谁知道这里发生了什么?还是有其他好的方法来满足我们的要求吗?
Qt版本是Qt 5.3.2。
谢谢!
答案 0 :(得分:2)
你是对的,显然removeItem
没有删除嵌入状态。下面的代码检查嵌入状态是否仍然存在,并使用setWidget
手动删除它。
我建议您为此报告一个Qt bug,因为它看起来确实像一个错误(您可以简单地将它们指向此帖,我过去就这样做了。)
QGraphicsScene* scene = new QGraphicsScene();
QWidget *widget = new QWidget;
// check widget has no proxy:
assert( widget->graphicsProxyWidget() == NULL );
// add the item:
scene->addWidget(widget);
// check widget has a proxy attached:
assert( widget->graphicsProxyWidget() && widget->graphicsProxyWidget()->widget() == widget );
// remove the item:
scene->removeItem(widget->graphicsProxyWidget());
if ( widget->graphicsProxyWidget() && widget->graphicsProxyWidget()->widget() == widget )
{
// widget still has a proxy attached, is this a Qt bug?
// manually unset proxy:
widget->graphicsProxyWidget()->setWidget( NULL );
// check widget has no proxy:
assert( widget->graphicsProxyWidget() == NULL );
}
// add the item:
scene->addWidget(widget);
// check widget has a proxy attached:
assert( widget->graphicsProxyWidget() && widget->graphicsProxyWidget()->widget() == widget );