由场景中的removeItem删除的QWidget无法重新添加到另一个场景中

时间:2015-07-21 04:08:50

标签: qt qt5

我们有QWidgetaddWidget添加到场景中。我们希望在切换到不同场景时保持显示。我们的方法是暂时将其从场景中移除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。

谢谢!

1 个答案:

答案 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 );