URI: 
       tqrcodewidget.py - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
       tqrcodewidget.py (4646B)
       ---
            1 import qrcode
            2 
            3 from PyQt5.QtGui import QColor, QPen
            4 import PyQt5.QtGui as QtGui
            5 from PyQt5.QtCore import Qt
            6 from PyQt5.QtWidgets import (
            7     QApplication, QVBoxLayout, QTextEdit, QHBoxLayout, QPushButton, QWidget,
            8     QFileDialog,
            9 )
           10 
           11 from electrum.i18n import _
           12 from electrum.simple_config import SimpleConfig
           13 
           14 from .util import WindowModalDialog, WWLabel, getSaveFileName
           15 
           16 
           17 class QRCodeWidget(QWidget):
           18 
           19     def __init__(self, data = None, fixedSize=False):
           20         QWidget.__init__(self)
           21         self.data = None
           22         self.qr = None
           23         self.fixedSize=fixedSize
           24         if fixedSize:
           25             self.setFixedSize(fixedSize, fixedSize)
           26         self.setData(data)
           27 
           28 
           29     def setData(self, data):
           30         if self.data != data:
           31             self.data = data
           32         if self.data:
           33             self.qr = qrcode.QRCode(
           34                 error_correction=qrcode.constants.ERROR_CORRECT_L,
           35                 box_size=10,
           36                 border=0,
           37             )
           38             self.qr.add_data(self.data)
           39             if not self.fixedSize:
           40                 k = len(self.qr.get_matrix())
           41                 self.setMinimumSize(k*5,k*5)
           42         else:
           43             self.qr = None
           44 
           45         self.update()
           46 
           47 
           48     def paintEvent(self, e):
           49         if not self.data:
           50             return
           51 
           52         black = QColor(0, 0, 0, 255)
           53         white = QColor(255, 255, 255, 255)
           54         black_pen = QPen(black)
           55         black_pen.setJoinStyle(Qt.MiterJoin)
           56 
           57         if not self.qr:
           58             qp = QtGui.QPainter()
           59             qp.begin(self)
           60             qp.setBrush(white)
           61             qp.setPen(white)
           62             r = qp.viewport()
           63             qp.drawRect(0, 0, r.width(), r.height())
           64             qp.end()
           65             return
           66 
           67         matrix = self.qr.get_matrix()
           68         k = len(matrix)
           69         qp = QtGui.QPainter()
           70         qp.begin(self)
           71         r = qp.viewport()
           72 
           73         margin = 10
           74         framesize = min(r.width(), r.height())
           75         boxsize = int( (framesize - 2*margin)/k )
           76         size = k*boxsize
           77         left = (framesize - size)/2
           78         top = (framesize - size)/2
           79         # Draw white background with margin
           80         qp.setBrush(white)
           81         qp.setPen(white)
           82         qp.drawRect(0, 0, framesize, framesize)
           83         # Draw qr code
           84         qp.setBrush(black)
           85         qp.setPen(black_pen)
           86         for r in range(k):
           87             for c in range(k):
           88                 if matrix[r][c]:
           89                     qp.drawRect(int(left+c*boxsize), int(top+r*boxsize),
           90                                 boxsize - 1, boxsize - 1)
           91         qp.end()
           92 
           93 
           94 
           95 class QRDialog(WindowModalDialog):
           96 
           97     def __init__(
           98             self,
           99             *,
          100             data,
          101             parent=None,
          102             title="",
          103             show_text=False,
          104             help_text=None,
          105             show_copy_text_btn=False,
          106             config: SimpleConfig,
          107     ):
          108         WindowModalDialog.__init__(self, parent, title)
          109         self.config = config
          110 
          111         vbox = QVBoxLayout()
          112 
          113         qrw = QRCodeWidget(data)
          114         qr_hbox = QHBoxLayout()
          115         qr_hbox.addWidget(qrw)
          116         qr_hbox.addStretch(1)
          117         vbox.addLayout(qr_hbox)
          118 
          119         help_text = data if show_text else help_text
          120         if help_text:
          121             text_label = WWLabel()
          122             text_label.setText(help_text)
          123             vbox.addWidget(text_label)
          124         hbox = QHBoxLayout()
          125         hbox.addStretch(1)
          126 
          127         def print_qr():
          128             filename = getSaveFileName(
          129                 parent=self,
          130                 title=_("Select where to save file"),
          131                 filename="qrcode.png",
          132                 config=self.config,
          133             )
          134             if not filename:
          135                 return
          136             p = qrw.grab()
          137             p.save(filename, 'png')
          138             self.show_message(_("QR code saved to file") + " " + filename)
          139 
          140         def copy_image_to_clipboard():
          141             p = qrw.grab()
          142             QApplication.clipboard().setPixmap(p)
          143             self.show_message(_("QR code copied to clipboard"))
          144 
          145         def copy_text_to_clipboard():
          146             QApplication.clipboard().setText(data)
          147             self.show_message(_("Text copied to clipboard"))
          148 
          149         b = QPushButton(_("Copy Image"))
          150         hbox.addWidget(b)
          151         b.clicked.connect(copy_image_to_clipboard)
          152 
          153         if show_copy_text_btn:
          154             b = QPushButton(_("Copy Text"))
          155             hbox.addWidget(b)
          156             b.clicked.connect(copy_text_to_clipboard)
          157 
          158         b = QPushButton(_("Save"))
          159         hbox.addWidget(b)
          160         b.clicked.connect(print_qr)
          161 
          162         b = QPushButton(_("Close"))
          163         hbox.addWidget(b)
          164         b.clicked.connect(self.accept)
          165         b.setDefault(True)
          166 
          167         vbox.addLayout(hbox)
          168         self.setLayout(vbox)