我正面临一个我无法解释的问题。在“Designer”GUI中有一个QGraphicsView,我用它作为自定义GraphicsView的占位符。我已经覆盖了resizeEvent()方法并设置了场景的rect。 作为自定义类的场景,我也想用它来显示图形。
问题:有时启动应用程序时会崩溃,有时却不会崩溃。这种行为不符合规则,即有时我会在有时三次崩溃之前启动它十次,依此类推。
我拍了一个调用堆栈的截图,但似乎我无法理解这个问题。希望有人这样做。
首先,首先是代码:
mainwindow.cpp
graph = new GraphScene(this);
ui->gv_graph->setScene(graph);
graph->addAxisLabels("P", "t");
graphicsview.cpp
GraphicsView::GraphicsView(QWidget *parent)
:QGraphicsView(parent)
{
}
void GraphicsView::resizeEvent(QResizeEvent *event)
{
if(GraphScene *s = dynamic_cast<GraphScene*>(scene()))
s->updateSceneRect(QRectF(QPointF(0,0), event->size()));
}
graphscene.cpp
const float GraphScene::margin = 20.0f;
GraphScene::GraphScene(QObject *parent)
:QGraphicsScene(parent)
{
}
void GraphScene::updateSceneRect(const QRectF &rect)
{
setSceneRect(rect);
if(_frameRect)
removeItem(_frameRect);
_frameRect = new QGraphicsRectItem;
_frame.setTopLeft(QPointF(margin, margin));
_frame.setWidth(rect.width()-2*margin);
_frame.setHeight(rect.height()-2*margin);
_frameRect->setRect(_frame);
addItem(_frameRect);
}
void GraphScene::addAxisLabels(const QString& xLabel, const QString& yLabel)
{
if(_xLabel)
removeItem(_xLabel);
if(_yLabel)
removeItem(_yLabel);
_xLabel = new QGraphicsSimpleTextItem(xLabel);
_xLabel->setX(margin+1);
_xLabel->setY(margin+1);
addItem(_xLabel);
//_yLabel = new QGraphicsSimpleTextItem;
}
因此,正如我在调用堆栈中看到的那样,在上述两个函数之一中调用removeItem()时会出现问题。
截图:
环境信息:
有人可以提供一些帮助,提示或其他。非常感谢。谢谢!