Stop listening to its children before the template editor is destroyed

Closing a title block template editor crashed it. The editor deletes
itself on close; QWidget's destructor then deletes its children, and
some of them signal the editor as they go:

- the scene deselects its cells, so the view emits
  selectedCellsChanged() to the editor's slot of the same name (when a
  cell was selected);
- the undo stack is cleared, so it emits cleanChanged() to
  updateEditorTitle() (when the template was edited).

Both slots then run on an object whose destructor has already run. A
Debug build aborts ("Called object is not of the correct type (class
destructor may have already run)"); a release build calls a member
function of a destroyed object.

Disconnect every child of the editor from it in the editor's
destructor, before the base destructors delete the children.

No file-format change, no change while the editor is open.

Tests: none automated; the editor needs the whole application.
Checked by hand (see the PR).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Beat Hangartner <beat@hangartners.ch>
This commit is contained in:
Beat Hangartner
2026-10-09 00:40:06 +02:00
parent bdeef6d306
commit 0e2738b246
+11 -1
View File
@@ -55,7 +55,17 @@ QETTitleBlockTemplateEditor::QETTitleBlockTemplateEditor(QWidget *parent) :
Destructor
*/
QETTitleBlockTemplateEditor::~QETTitleBlockTemplateEditor()
{}
{
// QWidget's destructor deletes the children, and some of them
// signal this editor as they go: the scene deselects its cells (the
// view emits selectedCellsChanged()), the undo stack is cleared
// (cleanChanged()). By then this editor is already destroyed, so
// stop listening to all of its children first.
const auto children = findChildren<QObject *>();
for (QObject *child : children) {
disconnect(child, nullptr, this, nullptr);
}
}
/**
@return the location of the currently edited template