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:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user