diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index dab64929af..2bf6a2043d 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -123,6 +123,10 @@ MDIViewPage::MDIViewPage(ViewProviderPage *pageVp, Gui::Document* doc, QWidget* setMouseTracking(true); m_scene = new QGraphicsScene(this); + m_scene->setItemIndexMethod(QGraphicsScene::NoIndex); //this prevents crash when deleting dims. + //scene(view?) indices of dirty regions gets + //out of sync. missing prepareGeometryChange + //somewhere???? QTBUG-18021??? m_view = new QGVPage(pageVp,m_scene,this); m_toggleKeepUpdatedAction = new QAction(tr("Toggle &Keep Updated"), this); @@ -398,9 +402,11 @@ bool MDIViewPage::attachView(App::DocumentObject *obj) void MDIViewPage::onDeleteObject(const App::DocumentObject& obj) { //if this page has a QView for this obj, delete it. + blockSelection(true); if (obj.isDerivedFrom(TechDraw::DrawView::getClassTypeId())) { (void) m_view->removeQViewByName(obj.getNameInDocument()); } + blockSelection(false); } void MDIViewPage::onTimer() { diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 403bde8939..78bb7d54dc 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -627,6 +627,16 @@ MDIViewPage* QGIView::getMDIViewPage(void) const return MDIViewPage::getFromScene(scene()); } +//remove a child of this from scene while keeping scene indexes valid +void QGIView::removeChild(QGIView* child) +{ + if ( (child != nullptr) && + (child->parentItem() == this) ) { + prepareGeometryChange(); + scene()->removeItem(child); + } +} + bool QGIView::getFrameState(void) { // Base::Console().Message("QGIV::getFrameState() - %s\n",getViewName()); diff --git a/src/Mod/TechDraw/Gui/QGIView.h b/src/Mod/TechDraw/Gui/QGIView.h index 845a4d055c..9d7ba264d7 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -122,6 +122,7 @@ public: static const double DefaultFontSizeInMM; MDIViewPage* getMDIViewPage(void) const; + virtual void removeChild(QGIView* child); // Mouse handling virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override; diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp index e7578df7cc..bf22ed0063 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp @@ -217,6 +217,7 @@ void QGIDatumLabel::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt void QGIDatumLabel::setPosFromCenter(const double &xCenter, const double &yCenter) { + prepareGeometryChange(); QGIViewDimension* qgivd = dynamic_cast(parentItem()); if( qgivd == nullptr ) { return; //tarfu @@ -266,6 +267,7 @@ void QGIDatumLabel::setLabelCenter() void QGIDatumLabel::setFont(QFont f) { + prepareGeometryChange(); m_dimText->setFont(f); m_unitText->setFont(f); QFont tFont(f); @@ -679,6 +681,7 @@ QString QGIViewDimension::getLabelText(void) void QGIViewDimension::draw() { + prepareGeometryChange(); if (!isVisible()) { return; } diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 7d511ed58d..a6b1e51696 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -137,7 +137,11 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGraphicsScene* s, QWidget *parent) setMouseTracking(true); viewport()->setMouseTracking(true); - setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); +// setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); //this prevents crash when deleting dims. + //scene(view?) indices of dirty regions gets + //out of sync. missing prepareGeometryChange + //somewhere???? QTBUG-18021???? setCacheMode(QGraphicsView::CacheBackground); Base::Reference hGrp = App::GetApplication().GetUserParameter() @@ -306,7 +310,8 @@ int QGVPage::removeQViewByName(const char* name) balloon->disconnect(); } removeQViewFromScene(ourItem); - delete ourItem; + delete ourItem; //commenting this prevents crash but means a small memory waste. + //alternate fix(?) is to change indexing/caching option in scene/view } return 0; @@ -314,17 +319,13 @@ int QGVPage::removeQViewByName(const char* name) void QGVPage::removeQViewFromScene(QGIView *view) { - QGraphicsItemGroup* grp = view->group(); - if (grp) { - grp->removeFromGroup(view); - } - - if (view->parentItem()) { //not top level - view->setParentItem(0); - } - - if (view->scene()) { - view->scene()->removeItem(view); + if (view->scene() != nullptr) { + QGIView* qgParent = dynamic_cast(view->parentItem()); + if (qgParent != nullptr) { + qgParent->removeChild(view); + } else { + view->scene()->removeItem(view); + } } }