| 25 | |
| 26 | |
| 27 | class BackingPaint(QThread): |
| 28 | resized = Signal(int, int) |
| 29 | |
| 30 | def __init__(self, widget, *args, **kwargs): |
| 31 | super().__init__(*args, **kwargs) |
| 32 | self._widget = widget |
| 33 | self._window = None |
| 34 | self._backingStore = None |
| 35 | self._rect = QRect() |
| 36 | self._size = QSize(100, 100) |
| 37 | self._oldSize = QSize(100, 100) |
| 38 | self._resized = Event() |
| 39 | self._exited = Event() |
| 40 | self._init() |
| 41 | |
| 42 | def _init(self): |
| 43 | self._widget.setAttribute(Qt.WA_NativeWindow) |
| 44 | self._widget.setAttribute(Qt.WA_PaintOnScreen) |
| 45 | self._widget.setAttribute(Qt.WA_StaticContents) |
| 46 | self._widget.setAttribute(Qt.WA_OpaquePaintEvent) |
| 47 | self._widget.setAttribute(Qt.WA_NoSystemBackground) |
| 48 | self._widget.setAttribute(Qt.WA_DontCreateNativeAncestors) |
| 49 | self._widget.setUpdatesEnabled(False) |
| 50 | self._widget.setAutoFillBackground(False) |
| 51 | |
| 52 | self._window = self._widget.windowHandle() |
| 53 | self._window.create() |
| 54 | |
| 55 | def stop(self): |
| 56 | self._exited.set() |
| 57 | self.requestInterruption() |
| 58 | |
| 59 | def resize(self, w, h): |
| 60 | self._resized.set() |
| 61 | self._size = QSize(w, h) |
| 62 | |
| 63 | def paintOnGui(self): |
| 64 | if self._backingStore and not self._exited.is_set(): |
| 65 | self._backingStore.flush(QRegion(self._rect)) |
| 66 | |
| 67 | def run(self): |
| 68 | self.resized.connect(self.resize, Qt.QueuedConnection) |
| 69 | full = os.getenv("full") |
| 70 | delay = int(1000 / 60) |
| 71 | isMac = platform.system() == "Darwin" |
| 72 | |
| 73 | # create backingStore |
| 74 | self._oldSize = self._widget.size() |
| 75 | self._backingStore = QBackingStore(self._window) |
| 76 | self._backingStore.resize(self._oldSize) |
| 77 | |
| 78 | # paint device |
| 79 | rect = QRect(QPoint(0, 0), self._oldSize) |
| 80 | self._backingStore.beginPaint(QRegion(rect)) |
| 81 | if not self._backingStore.paintDevice(): |
| 82 | print("paintDevice is None") |
| 83 | return |
| 84 | self._backingStore.endPaint() |