From 417423ecd7ccab199db9327a626b56219a3e3276 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 24 Apr 2023 00:58:41 +0000 Subject: [PATCH] qt: PayToEdit: fix input_qr_from_camera closes https://github.com/spesmilo/electrum/issues/8342 probably regression from 1f4cedf56a342ed4b1e1e5dea69e037dd1f8083f --- electrum/gui/qt/paytoedit.py | 1 + electrum/gui/qt/qrreader/__init__.py | 1 + electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py | 6 +++--- electrum/gui/qt/util.py | 5 ++++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/electrum/gui/qt/paytoedit.py b/electrum/gui/qt/paytoedit.py index b43354ba4..964a729da 100644 --- a/electrum/gui/qt/paytoedit.py +++ b/electrum/gui/qt/paytoedit.py @@ -129,6 +129,7 @@ class PayToEdit(Logger, GenericInputHandler): allow_multi=False, show_error=self.win.show_error, setText=self._on_input_btn, + parent=self.win, ) self.on_qr_from_screenshot_input_btn = partial( self.input_qr_from_screenshot, diff --git a/electrum/gui/qt/qrreader/__init__.py b/electrum/gui/qt/qrreader/__init__.py index 8e39f21f3..9dd7ada95 100644 --- a/electrum/gui/qt/qrreader/__init__.py +++ b/electrum/gui/qt/qrreader/__init__.py @@ -49,6 +49,7 @@ def scan_qrcode( callback: Callable[[bool, str, Optional[str]], None], ) -> None: """Scans QR code using camera.""" + assert parent is None or isinstance(parent, QWidget), f"parent should be a QWidget, not {parent!r}" if sys.platform == 'darwin' or sys.platform in ('windows', 'win32'): _scan_qrcode_using_qtmultimedia(parent=parent, config=config, callback=callback) else: # desktop Linux and similar diff --git a/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py b/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py index 54ad1a1c9..9b25e1e76 100644 --- a/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py +++ b/electrum/gui/qt/qrreader/qtmultimedia/camera_dialog.py @@ -27,10 +27,10 @@ import time import math import sys import os -from typing import List +from typing import List, Optional from PyQt5.QtMultimedia import QCameraInfo, QCamera, QCameraViewfinderSettings -from PyQt5.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QCheckBox, QPushButton, QLabel +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QCheckBox, QPushButton, QLabel, QWidget from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import QSize, QRect, Qt, pyqtSignal, PYQT_VERSION @@ -68,7 +68,7 @@ class QrReaderCameraDialog(Logger, MessageBoxMixin, QDialog): qr_finished = pyqtSignal(bool, str, object) - def __init__(self, parent, *, config: SimpleConfig): + def __init__(self, parent: Optional[QWidget], *, config: SimpleConfig): ''' Note: make sure parent is a "top_level_window()" as per MessageBoxMixin API else bad things can happen on macOS. ''' QDialog.__init__(self, parent=parent) diff --git a/electrum/gui/qt/util.py b/electrum/gui/qt/util.py index 2e400e158..32f06398a 100644 --- a/electrum/gui/qt/util.py +++ b/electrum/gui/qt/util.py @@ -547,6 +547,7 @@ class GenericInputHandler: allow_multi: bool = False, show_error: Callable[[str], None], setText: Callable[[str], None] = None, + parent: QWidget = None, ) -> None: if setText is None: setText = self.setText @@ -564,7 +565,9 @@ class GenericInputHandler: setText(new_text) from .qrreader import scan_qrcode - scan_qrcode(parent=self, config=config, callback=cb) + if parent is None: + parent = self if isinstance(self, QWidget) else None + scan_qrcode(parent=parent, config=config, callback=cb) def input_qr_from_screenshot( self,