如何正确删除是中央小部件的Qgraphicsview对象

How to delete correctly QGraphicsView object which was the central widget?

本文关键字:Qgraphicsview 对象 小部 何正确 删除      更新时间:2023-10-16

有以下代码。它创建QgraphicsView对象,设置一个场景,然后创建一个QgraphicsWebView对象,该对象已添加到场景中:

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"

10秒后,有一个插槽,该插槽试图删除qgraphicsview对象。问题在于,当我尝试删除GraphicsView时,该程序在大约2秒后崩溃。回溯是垃圾。理论上Qgraphicsview对象应删除其孩子,而孩子是Qgraphicsscene对象。场景应删除其孩子,即QgraphicsWebView对象。

如何在不崩溃过程的情况下正确删除qgraphicsview对象?

这是QT 4.8

我不明白为什么它不能正确清理,但是我不会使GraphicsView成为您场景的父母。而不是给场景为父母,只需在视图之后将其删除。

我无法复制。以下作用在OS X上的QT 4.8.7上始终如一,并且没有崩溃:

#include <QtGui>
#include <QGraphicsWebView>
#include <QGLWidget>
class Window : public QMainWindow {
   Q_OBJECT
   QWidget central;
   QVBoxLayout layout{&central};
   QPointer<QGraphicsView> view;
   QPushButton button{"Toggle View"};
   Q_SLOT void toggle() {
      if (!view) {
         view = new QGraphicsView;
         auto scene = new QGraphicsScene(view);
         auto webView = new QGraphicsWebView;
         webView->setUrl(QUrl("http://www.google.com"));
         scene->addItem(webView);
         view->setScene(scene);
         view->setViewport(new QGLWidget);
         view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
         layout.addWidget(view);
      } else {
         delete view;
         view = nullptr;
      }
   }
public:
   Window() {
      layout.addWidget(&button);
      layout.addStretch(1);
      setAttribute(Qt::WA_TranslucentBackground);
      setCentralWidget(&central);
      connect(&button, SIGNAL(clicked(bool)), SLOT(toggle()));
   }
};
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Window w;
   w.show();
   return app.exec();
}
#include "main.moc"