在QGraphicsScene中清除小部件:崩溃

时间:2013-12-04 22:42:59

标签: c++ qt4

我有一个带有QPushButton的QGraphicsScene,清除这个场景会使我的应用程序崩溃。有没有正确的方法来清除QWidget的场景?

单击按钮时,以下代码崩溃:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsProxyWidget>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QGraphicsScene *scene = new QGraphicsScene();

    QGraphicsView *view = new QGraphicsView();
    view->setScene(scene);
    view->show();

    QPushButton *button = new QPushButton("button");
    QObject::connect(button, SIGNAL(clicked()), scene, SLOT(clear()));

    QGraphicsProxyWidget *proxy = scene->addWidget(button);

    return app.exec();
}

1 个答案:

答案 0 :(得分:5)

程序崩溃的原因是QGraphicsScene :: clear()方法在使用那些非常数据结构的方法调用中删除了QButton(及其关联的数据结构) 。然后,在clear()返回后,调用方法立即尝试访问现在删除的数据(因为它不期望在其例程中删除),然后发生崩溃。您的问题是重新入侵问题的一个示例。

避免绊倒鞋带的最简单方法是使您的信号/插槽连接成为QueuedConnection而不是AutoConnection:

 QObject::connect(button, SIGNAL(clicked()), scene, SLOT(clear()), Qt::QueuedConnection);

这样,只有按钮的鼠标按下处理程序返回后才会执行clear()方法调用,因此将从上下文调用clear()安全删除按钮。