mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-06-11 21:53:14 +02:00
2b7e62f901
On macOS arm64 (Apple Silicon, Sequoia), exporting a PDF via QPrintPreviewWidget leaves a black screen with only the mouse cursor visible. Cmd+Tab restores the display; the exported PDF itself is correct and clickable cross-reference links work fine. Root cause ---------- requestPaint() is a slot connected to QPrintPreviewWidget::paintRequested. Inside this slot the code was calling painter.end() manually, then pdfConvertUriToGoTo(). On macOS arm64 the Qt5 paint cycle backed by Metal/CALayer is asynchronous: closing the QPainter from *within* the paintRequested slot interrupts the compositor before it has flushed the backing store. The window goes black and never repaints because the close() that follows immediately destroys it. On x86_64 / older macOS (raster/CoreGraphics backend) the paint cycle is synchronous, so the same code happened to work. Fix --- 1. Remove the manual painter.end() and pdfConvertUriToGoTo() call from requestPaint(). The QPainter is stack-allocated; it destructs normally when the slot returns, which is the correct moment to flush the PDF. 2. In print(), capture the output file name before m_preview->print(), then defer both pdfConvertUriToGoTo() and this->close() to the next event-loop iteration via QTimer::singleShot(0, ...). This gives the Metal compositor one full event-loop turn to finish compositing the backing store before the window is torn down. The fix is a no-op on all other platforms: QTimer::singleShot(0) posts an event that fires in the very next iteration, so there is no perceptible delay. Tested ------ - macOS Sequoia 15.x, Apple M-series, Qt 5.15.x (arm64): black screen gone - macOS 10.15 x86_64 VM, Qt 5.15.x: no regression - Linux/Debian Qt 5.15.x: no regression - PDF cross-reference links and GoTo/FitR destinations: unaffected Fixes: black screen after PDF export on macOS arm64