次のコードがあります。それは、QGraphicsViewオブジェクトを作成する場面を設定し、シーンに追加されたQGraphicsWebViewオブジェクトが作成されます。10秒後QGraphicsViewオブジェクトを削除しようとするスロットが呼び出され中央ウィジェットであったQGraphicsViewオブジェクトを正しく削除するには?
QGraphicsWebView* graphicsWebView;
QGraphicsScene* graphicsScene;
QGraphicsView* graphicsView;
QMainWindow* mainWindow;
class Deleter : public QObject
{
Q_OBJECT
public slots:
void deleteWebView()
{
mainWindow->hide();
mainWindow->centralWidget()->setParent(0);
mainWindow->setCentralWidget(new QWidget());
delete graphicsView; // <-- crashes about 2 seconds after that
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
mainWindow = new QMainWindow;
graphicsView = new QGraphicsView;
graphicsScene = new QGraphicsScene(graphicsView);
graphicsView->setScene(graphicsScene);
graphicsWebView = new QGraphicsWebView;
graphicsWebView->setUrl(QUrl("http://www.google.com"));
graphicsView->scene()->addItem(graphicsWebView);
graphicsView->setViewport(new QGLWidget());
graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
mainWindow->setAttribute(Qt::WA_TranslucentBackground);
mainWindow->setCentralWidget(graphicsView);
mainWindow->show();
Deleter d;
QTimer::singleShot(10000, &d, SLOT(deleteWebView()));
return app.exec();
}
#include "main.moc"
。問題は、graphicsViewを削除しようとすると、約2秒後にプログラムがクラッシュすることです。バックトレースはゴミです。理論的にQGraphicsViewオブジェクトはその子を削除し、子はQGraphicsSceneオブジェクトです。シーンはQGraphicsWebViewオブジェクトである子を削除する必要があります。
プロセスをクラッシュせずにQGraphicsViewオブジェクトを正しく削除する方法はありますか?
これはQtの4.8
中央ウィジェットの周りに余分なアクロバットを行うには理由がありません:あなたはもうそれを必要としないとき、単にウィジェットを削除します。 –