Qt应用程序在调用QGrahicsScene

时间:2015-07-04 07:57:15

标签: c++ qt qgraphicsscene

我正面临一个我无法解释的问题。在“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()时会出现问题。

截图: enter image description here

环境信息: enter image description here

有人可以提供一些帮助,提示或其他。非常感谢。谢谢!

0 个答案:

没有答案