Qt 场景中removeItem移除的QWidget可以';不能重新添加到另一个场景中

Qt 场景中removeItem移除的QWidget可以';不能重新添加到另一个场景中,qt,qt5,Qt,Qt5,我们有一个QWidget,它通过addWidget添加到场景中。我们希望在切换到不同场景时继续显示。我们的方法是通过removietem临时将其从场景中删除,切换到另一个场景后,我们调用addWidget重新添加它。但是,第二个addWidget会引发一个错误: QGraphicsProxyWidget::setWidget: cannot embed widget 0x7835ec8; already embedded 错误可通过以下代码再现: QWidget *widget = new Q

我们有一个
QWidget
,它通过
addWidget
添加到场景中。我们希望在切换到不同场景时继续显示。我们的方法是通过
removietem
临时将其从场景中删除,切换到另一个场景后,我们调用
addWidget
重新添加它。但是,第二个
addWidget
会引发一个错误:

QGraphicsProxyWidget::setWidget: cannot embed widget 0x7835ec8; already embedded
错误可通过以下代码再现:

QWidget *widget = new QWidget;
scene->addWidget(widget);
scene->removeItem(widget->graphicsProxyWidget());
scene->addWidget(widget);
似乎
removietem
并没有真正删除嵌入状态。有人知道这里发生了什么吗?或者有没有其他好的方法来满足我们的要求

Qt版本是Qt 5.3.2


谢谢

你是对的,显然
removietem
不会删除嵌入状态。下面的代码检查嵌入状态是否仍然存在,并使用setWidget手动将其删除

我建议你为此报告一个错误,因为它看起来真的像一个bug(你可以简单地将他们指向这篇文章,我在过去做过)


你的代码没有为我编译
removeItem
采用
QGraphicsSitem
,而不是
QGraphicsProxyWidget
。您需要添加
#include
才能通过编译。对不起,我没有清楚地提到这件事。已经有报道了。解决方法是在
remoteItem
之后手动调用
setWidget(NULL)
,就像您的代码一样。谢谢
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 );