From d5d1ed869ee2a5b2adb77d90447c50190229427b Mon Sep 17 00:00:00 2001 From: Dmitri Ovodok Date: Fri, 2 Nov 2018 17:14:36 +0200 Subject: [PATCH] fix #277745: reset pointers to Score and ScoreView in Timeline when they are destroyed --- mscore/timeline.cpp | 18 ++++++++++++++++-- mscore/timeline.h | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/mscore/timeline.cpp b/mscore/timeline.cpp index 062aa25190ad..c3cfd9336ca0 100644 --- a/mscore/timeline.cpp +++ b/mscore/timeline.cpp @@ -2230,6 +2230,7 @@ void Timeline::setScore(Score* s) scene()->clear(); if (_score) { + connect(_score, &QObject::destroyed, this, &Timeline::objectDestroyed, Qt::UniqueConnection); drawGrid(nstaves(), _score->nmeasures()); changeSelection(SelState::NONE); row_names->updateLabels(getLabels(), grid_height); @@ -2257,12 +2258,25 @@ void Timeline::setScoreView(ScoreView* v) { _cv = v; if (_cv) { - connect(_cv, SIGNAL(sizeChanged()), this, SLOT(updateView())); - connect(_cv, SIGNAL(viewRectChanged()), this, SLOT(updateView())); + connect(_cv, &ScoreView::sizeChanged, this, &Timeline::updateView, Qt::UniqueConnection); + connect(_cv, &ScoreView::viewRectChanged, this, &Timeline::updateView, Qt::UniqueConnection); + connect(_cv, &QObject::destroyed, this, &Timeline::objectDestroyed, Qt::UniqueConnection); updateView(); } } +//--------------------------------------------------------- +// objectDestroyed +//--------------------------------------------------------- + +void Timeline::objectDestroyed(QObject* obj) + { + if (_cv == obj) + setScoreView(nullptr); + else if (_score == obj) + setScore(nullptr); + } + //--------------------------------------------------------- // updateView //--------------------------------------------------------- diff --git a/mscore/timeline.h b/mscore/timeline.h index 5af8a855e06a..dc6d837c6a1f 100644 --- a/mscore/timeline.h +++ b/mscore/timeline.h @@ -176,6 +176,7 @@ class Timeline : public QGraphicsView { private slots: void handle_scroll(int value); void updateView(); + void objectDestroyed(QObject*); public slots: void changeSelection(SelState);