gpt4 book ai didi

c++ - 清除 QGraphicsScene : crash 中的小部件

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:07 24 4
gpt4 key购买 nike

我有一个 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() 方法调用将不会执行,直到 按钮的鼠标按下处理例程返回,因此 clear() 将从它所在的上下文中调用删除按钮是安全的。

关于c++ - 清除 QGraphicsScene : crash 中的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20387679/

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