Fix SIGSEGV: defer document open after dialog close

Opening documents (especially assemblies) inside the QDialog nested
event loop can crash FreeCAD when the Assembly solver triggers during
document restore. Move FreeCAD.openDocument() to after dialog.exec_()
returns.
This commit is contained in:
Zoe Forbes
2026-01-29 22:42:15 -06:00
parent e2b3f128c6
commit 8e44ed2f75

View File

@@ -988,17 +988,14 @@ class Silo_Open:
results_table.setItem(row, 4, QtGui.QTableWidgetItem(data["modified"]))
results_table.resizeColumnsToContents()
_open_after_close = [None]
def open_selected():
selected = results_table.selectedItems()
if not selected:
return
row = selected[0].row()
data = results_data[row]
if data["path"]:
FreeCAD.openDocument(data["path"])
else:
_sync.open_item(data["part_number"])
_open_after_close[0] = dict(results_data[row])
dialog.accept()
search_input.textChanged.connect(lambda: do_search())
@@ -1018,6 +1015,16 @@ class Silo_Open:
do_search()
dialog.exec_()
# Open the document AFTER the dialog has fully closed so that
# heavy document loads (especially Assembly files) don't run
# inside the dialog's nested event loop, which can cause crashes.
data = _open_after_close[0]
if data is not None:
if data.get("path"):
FreeCAD.openDocument(data["path"])
else:
_sync.open_item(data["part_number"])
def IsActive(self):
return True