gpt4 book ai didi

c++ - 场景更改时的 QGraphicsRectItem 和 QGraphicsScene 问题

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:54 26 4
gpt4 key购买 nike

我想做的是:

我有一个带 QGraphicsView 的小 GUI。在此图形 View 中,我加载了一张图片:

// 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、宽度、高度)。提供坐标后,用户按下按钮,将显示以下坐标处的矩形。我用这段代码完成了这个:

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: item 0x8c04080's scene (0x0) is different from this scene (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 的所有权,所以这会导致段错误......?)

最佳答案

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

此外,您无需将其从场景中移除即可对其进行更改。只需在场景中更改它即可。它将在下一次绘制事件中使用新的颜色和几何形状重新绘制。

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

关于c++ - 场景更改时的 QGraphicsRectItem 和 QGraphicsScene 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com