Windows-Fix: PDF-Dateisperren beim Akzeptieren von Änderungen beheben

Problem:
Unter Windows trat Fehler [WinError 32] auf beim Versuch, ref-PDFs zu
löschen/verschieben, da Dateien von QPdfDocument-Instanzen gesperrt waren.

Lösung:
- Neue Methode _close_all_pdf_documents() zum expliziten Schließen aller PDFs
- Schließt QPdfDocument-Instanzen und löscht alle Referenzen
- Erzwingt Garbage Collection zur Freigabe von Dateihandles
- Leert UI-Layouts und verarbeitet Qt-Events vor Dateioperationen
- QApplication.processEvents() stellt sicher, dass Widgets/Ressourcen
  wirklich freigegeben werden

Unter Linux war das Problem nicht aufgetreten, da dort geöffnete Dateien
gelöscht werden können.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-26 12:57:38 +01:00
parent 8c7db39f5f
commit 1da550879e
+40
View File
@@ -3762,8 +3762,33 @@ class MainWindow(QMainWindow):
logger.error(f"Fehler beim Übernehmen aller Änderungen: {e}") logger.error(f"Fehler beim Übernehmen aller Änderungen: {e}")
QMessageBox.critical(self, "Fehler", f"Fehler beim Übernehmen der Änderungen:\n{str(e)}") QMessageBox.critical(self, "Fehler", f"Fehler beim Übernehmen der Änderungen:\n{str(e)}")
def _close_all_pdf_documents(self):
"""Schließt alle geöffneten PDF-Dokumente explizit (wichtig für Windows)."""
import gc
if self.pdf_documents:
for pdf_basename, docs in self.pdf_documents.items():
for doc_type, doc in docs.items():
if doc:
doc.close()
logger.debug(f"PDF-Dokument geschlossen: {pdf_basename} ({doc_type})")
# Lösche alle Referenzen
self.pdf_documents.clear()
# Lösche gerenderte Pixmaps
self.current_rendered_pixmaps = None
# Erzwinge Garbage Collection um Dateihandles freizugeben (wichtig für Windows)
gc.collect()
logger.info("Alle PDF-Dokumente geschlossen und Referenzen freigegeben")
def _clear_pdf_viewer(self): def _clear_pdf_viewer(self):
"""Leert den PDF-Viewer und alle Thumbnails.""" """Leert den PDF-Viewer und alle Thumbnails."""
# Schließe alle PDF-Dokumente explizit (wichtig für Windows)
self._close_all_pdf_documents()
# Entferne Widgets aus Layouts # Entferne Widgets aus Layouts
self._clear_layout(self.ui.verticalLayout_2) self._clear_layout(self.ui.verticalLayout_2)
self._clear_layout(self.ui.verticalLayout_3) self._clear_layout(self.ui.verticalLayout_3)
@@ -3809,6 +3834,21 @@ class MainWindow(QMainWindow):
QMessageBox.warning(self, "Fehler", f"New-PDF nicht gefunden:\n{pdf_basename}") QMessageBox.warning(self, "Fehler", f"New-PDF nicht gefunden:\n{pdf_basename}")
return return
# Schließe alle PDF-Dokumente und leere UI VOR dem Löschen/Verschieben (wichtig für Windows)
self._close_all_pdf_documents()
# Entferne auch alle Widgets, die Pixmaps enthalten könnten
self._clear_layout(self.ui.verticalLayout_2)
self._clear_layout(self.ui.verticalLayout_3)
self.thumbnail_to_page = {}
self.fullsize_label = None
# Verarbeite alle pending Qt Events um sicherzustellen, dass Widgets/Ressourcen freigegeben werden
from PySide6.QtWidgets import QApplication
QApplication.processEvents()
logger.info("PDF-Dokumente geschlossen und UI geleert vor Dateioperationen")
# Lösche alte ref-PDF falls vorhanden # Lösche alte ref-PDF falls vorhanden
if ref_pdf_path.exists(): if ref_pdf_path.exists():
ref_pdf_path.unlink() ref_pdf_path.unlink()