我想做的是以下内容:
我有一个带有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的所有权,所以这会导致分段错误......?)
答案 0 :(得分:4)
消息QGraphicsScene::removeItem: item 0x8c04080's scene (0x0) is different from this scene (0x8c0a8b0)
告诉您m_rect
在您呼叫时不在任何场景中。它可能已从代码中的其他位置删除,或者您在类层次结构中有2个具有相同名称的变量。
此外,您无需从场景中删除它即可进行更改。只需在场景中进行更改即可。它将在下一次油漆事件中重新粉刷新的颜色和几何体。
即使您真的想在更改之前删除它,只需通过调用QGraphicsItem::scene()
来检查它是否在场景中。不需要init检查变量。