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:
Forbes
2026-01-29 22:42:15 -06:00
parent b200fd06bc
commit 8b66274a7a

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