2016-12-13 4 views
0

다음 코드가 있습니다. 그것은를 QGraphicsView 객체를 생성하는 장면을 설정하고 장면에 추가됩니다 QGraphicsWebView 개체가 생성됩니다중앙 위젯 인 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" 

10 초 동안 나중에를 QGraphicsView 개체를 삭제하려고 슬롯이 호출됩니다. 문제는 graphicsView를 삭제하려고하면 프로그램이 약 2 초 후에 충돌한다는 것입니다. 백 트래 이스는 쓰레기입니다. 이론적으로 QGraphicsView 개체는 해당 자식을 제거해야하며 자식은 QGraphicsScene 개체입니다. 장면은 QGraphicsWebView 객체 인 자식을 제거해야합니다.

프로세스를 중단하지 않고 QGraphicsView 객체를 올바르게 삭제하는 방법은 무엇입니까?

는 Qt는 4.8

+0

없습니다 : 당신이 더 이상 필요하지 않을 때 단순히 위젯을 삭제합니다. –

답변

0

제대로 정리하지 않는 이유를 이해하지 않습니다,하지만 난 graphicsView 장면의 부모하지 것입니다. 장면을 부모에게주는 대신보기 뒤 deleteWebView 슬롯에서 삭제하십시오.

0

재현 할 수 없습니다. 다음 작품 일관되고 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"