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