From 1da550879e503ab9ab937c3805d2c6f9a2ce92c4 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Fri, 26 Dec 2025 12:57:38 +0100 Subject: [PATCH] =?UTF-8?q?Windows-Fix:=20PDF-Dateisperren=20beim=20Akzept?= =?UTF-8?q?ieren=20von=20=C3=84nderungen=20beheben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/ui/MainWindow.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index b129ebb..ef8939f 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -3762,8 +3762,33 @@ class MainWindow(QMainWindow): logger.error(f"Fehler beim Übernehmen aller Änderungen: {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): """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 self._clear_layout(self.ui.verticalLayout_2) 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}") 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 if ref_pdf_path.exists(): ref_pdf_path.unlink()