场景中的QGraphicsRectItem和QGraphicsScene问题发生了变化

时间:2011-12-29 13:03:16

标签: c++ qt user-interface graphics

我想做的是以下内容:

我有一个带有QGraphicsView的GUI。在此图形视图中我加载图片:

// m_picture is QPixmap
// image is QImage
// m_graphic is QGraphicsScene
// graphicsView is QGraphicsView

m_picture.convertFromImage(image);
m_graphic->addPixmap(m_picture);
ui->graphicsView->setScene(m_graphic);

这不会导致任何问题,我总是可以毫无问题地加载新图像。 现在除了显示我想让用户在其上绘制矩形(“聚焦”在特定区域)的图片之外。实际上,用户只需在GUI上的四个文本框中键入坐标(x,y,width,heigth)。在提供坐标后,用户按下按钮,并显示以下坐标处的矩形。 我用这段代码完成了这个:

void tesseract_gui::show_preview_rect()
{
    int x,y,h,w;
    x = ui->numBox_x->value();
    y = ui->numBox_y->value();
    h = ui->numBox_h->value();
    w = ui->numBox_w->value();

    if( rect_initialized )
    {
        m_graphic->removeItem(m_rect);
    }
    else
    {
        rect_initialized = true;
    }
    m_rect->setPen(QPen(Qt::red));
    m_rect->setRect(x,y,h,w);
    m_graphic->addItem(m_rect);
    return;
}

删除调用是因为我总是只想显示一个矩形。 现在我提到这个工作正常。但是如果用户现在加载另一张图片(我的帖子顶部有调用),当我尝试绘制一个新的矩形时,程序会崩溃。一世 在

的调用下得到分段错误
m_rect->setPen(QPen(Qt::red));

如果我打电话

m_graphic->removeItem(m_rect);

加载新图片后我得到了

  

QGraphicsScene :: removeItem:项目0x8c04080的场景(0x0)与此场景不同(0x8c0a8b0)

然后它在setPen中以相同的错误崩溃。

我不知道的是,我不改变场景。我只是添加另一张图片(或覆盖它)。 那么我有什么建议可以做到这一点吗?

最好的问候

//编辑:

我试着每次都像这样一个新的矩形:

void tesseract_gui::show_preview_rect()
{
    int x,y,h,w;
    x = ui->numBox_x->value();
    y = ui->numBox_y->value();
    h = ui->numBox_h->value();
    w = ui->numBox_w->value();

    m_graphic->clear();

    m_graphic->addRect(x,y,h,w);
    return;
}

问题在于,使用clear()调用它也会从我的GraphicsView中清除图片本身...所以没有解决方案

//编辑:

正如所建议我摆脱了警告:

if( m_rect->scene() != 0 )
{
    m_graphic->removeItem(m_rect);
}

m_rect->setPen(QPen(Qt::red));
m_rect->setRect(x,y,h,w);
m_graphic->addItem(m_rect);

我知道这不是最好的方式,但我也是这样尝试过(对我来说不起作用):

我在构造函数中添加了项目:

m_graphic->addItem(m_rect);

然后

m_rect->setPen(QPen(Qt::red));
m_rect->setRect(x,y,h,w);
m_graphic->update();

和我一样得到“相同”错误(程序在m_rect-> setPen()崩溃) 因此,当我已经将矩形添加到图形时,似乎总是会出现问题,然后更改了m_graphic的图像,然后使用m_rect执行任何操作。 (实际上我猜m_graphic取得了m_rect的所有权,所以这会导致分段错误......?)

1 个答案:

答案 0 :(得分:4)

消息QGraphicsScene::removeItem: item 0x8c04080's scene (0x0) is different from this scene (0x8c0a8b0)告诉您m_rect在您呼叫时不在任何场景中。它可能已从代码中的其他位置删除,或者您在类层次结构中有2个具有相同名称的变量。

此外,您无需从场景中删除它即可进行更改。只需在场景中进行更改即可。它将在下一次油漆事件中重新粉刷新的颜色和几何体。

即使您真的想在更改之前删除它,只需通过调用QGraphicsItem::scene()来检查它是否在场景中。不需要init检查变量。