From 64869810cd82ba8f27c56bdfa950acd2ff381e9c Mon Sep 17 00:00:00 2001 From: hairykiwi <174199+hairykiwi@users.noreply.github.com> Date: Sun, 18 Oct 2026 12:59:19 +0100 Subject: [PATCH] Guard elements-panel project-open auto-select against a detached item - ElementsPanel::addProject auto-selects the first diagram via setCurrentItem(qtwi_project->child(0)). When a project is opened before the panel's first reload() has created its title-block collection items, indexOfTopLevelItem(common_tbt_collection_item_) returns -1 and the preceding insertChild() leaves qtwi_project detached from the tree model. - The unguarded auto-select leaves a detached/invalid current item -- an intermittent SIGSEGV in QTreeModel::index()/parent() on some builds; on current master with Qt 6.11.2 the test shows the invalid selection without a fault. Calling setCurrentItem() on an item the QTreeModel does not own is unsafe; guard the auto-select with qtwi_project->treeWidget() so it runs only when the item is attached. - No behavioural change in the normal case: reload() re-adds the project attached shortly after and performs the selection then. - Pre-existing since a82f6de23 ("Add highlight current page in ProjectView"). Assisted-by: Claude Code Signed-off-by: hairykiwi <174199+hairykiwi@users.noreply.github.com> --- sources/elementspanel.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sources/elementspanel.cpp b/sources/elementspanel.cpp index 1eac9c8ff..349f1e9b6 100644 --- a/sources/elementspanel.cpp +++ b/sources/elementspanel.cpp @@ -156,9 +156,11 @@ QTreeWidgetItem *ElementsPanel::addProject(QETProject *project, if (first_add){ qtwi_project -> setExpanded(true); - // on adding an project select first diagram - setCurrentItem(qtwi_project -> child(0)); - qtwi_project -> child(0)->setSelected(true); + // on adding a project select first diagram, once the project item is attached + if (qtwi_project -> treeWidget()) { + setCurrentItem(qtwi_project -> child(0)); + qtwi_project -> child(0)->setSelected(true); + } } else { // 2. Check whether we can restore the previous selection