我有一个 QGraphicsScene,里面有一个 QPushButton,清除这个场景将使我的应用程序崩溃。有没有正确的方法来使用 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();
}
程序崩溃的原因是 QGraphicsScene::clear() 方法删除了 QButton(及其关联的数据结构)在使用这些数据结构的方法调用中间。然后,在clear()返回后,调用方法立即尝试访问现在已删除的数据(因为它不希望在例程中间被删除),然后砰的一声——崩溃了。你的问题是一个例子重入问题.
避免被鞋带绊倒的最简单方法是使信号/槽连接成为 QueuedConnection 而不是 AutoConnection:
QObject::connect(button, SIGNAL(clicked()), scene, SLOT(clear()), Qt::QueuedConnection);
这样,clear() 方法调用将不会被执行,直到after按钮的鼠标按下处理例程已返回,因此将从可以安全删除按钮的上下文中调用clear()。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)