def CreateQRMatrix(dataToEncode, errLevel=QRErrorCorrectLevel.L): dataLen = len(dataToEncode) baseSz = 4 if errLevel == QRErrorCorrectLevel.L else \ 5 if errLevel == QRErrorCorrectLevel.M else \ 6 if errLevel == QRErrorCorrectLevel.Q else \ 7 # errLevel = QRErrorCorrectLevel.H sz = baseSz if dataLen < 70 else 5 + (dataLen - 70) / 30 qrmtrx = [[]] while sz<20: try: errCorrectEnum = getattr(QRErrorCorrectLevel, errLevel.upper()) qr = QRCode(sz, errCorrectEnum) qr.addData(dataToEncode) qr.make() success=True break except TypeError: sz += 1 if not success: LOGERROR('Unsuccessful attempt to create QR code') LOGERROR('Data to encode: (Length: %s, isAscii: %s)', \ len(dataToEncode), isASCII(dataToEncode)) return [[0]], 1 qrmtrx = [] modCt = qr.getModuleCount() for r in range(modCt): tempList = [0]*modCt for c in range(modCt): # The matrix is transposed by default, from what we normally expect tempList[c] = 1 if qr.isDark(c,r) else 0 qrmtrx.append(tempList) return [qrmtrx, modCt]
def setAsciiData(self, newAscii, prefSize=160, errLevel=QRErrorCorrectLevel.L, repaint=True): if len(newAscii)==0: self.qrmtrx = [[0]] self.modCt = 1 self.pxScale= 1 return self.theData = newAscii sz=3 success=False while sz<20: try: self.qr = QRCode(sz, errLevel) self.qr.addData(self.theData) self.qr.make() success=True break except TypeError: sz += 1 if not success: LOGERROR('Unsuccessful attempt to create QR code') self.qrmtrx = [[0]] return self.qrmtrx = [] self.modCt = self.qr.getModuleCount() for r in range(self.modCt): tempList = [0]*self.modCt for c in range(self.modCt): tempList[c] = 1 if self.qr.isDark(r,c) else 0 self.qrmtrx.append(tempList) self.setPreferredSize(prefSize)
def setAsciiData(self, newAscii, prefSize=160, errLevel=QRErrorCorrectLevel.L, repaint=True): if len(newAscii) == 0: self.qrmtrx = [[0]] self.modCt = 1 self.pxScale = 1 return self.theData = newAscii sz = 3 success = False while sz < 20: try: self.qr = QRCode(sz, errLevel) self.qr.addData(self.theData) self.qr.make() success = True break except TypeError: sz += 1 if not success: LOGERROR('Unsuccessful attempt to create QR code') self.qrmtrx = [[0]] return self.qrmtrx = [] self.modCt = self.qr.getModuleCount() for r in range(self.modCt): tempList = [0] * self.modCt for c in range(self.modCt): tempList[c] = 1 if self.qr.isDark(r, c) else 0 self.qrmtrx.append(tempList) self.setPreferredSize(prefSize)
class QRCodeWidget(QWidget): def __init__(self, asciiToEncode='', prefSize=160, errLevel=QRErrorCorrectLevel.L, parent=None): super(QRCodeWidget, self).__init__() self.parent = parent self.qrmtrx = None self.setAsciiData(asciiToEncode, prefSize, errLevel, repaint=False) def setAsciiData(self, newAscii, prefSize=160, errLevel=QRErrorCorrectLevel.L, repaint=True): if len(newAscii)==0: self.qrmtrx = [[0]] self.modCt = 1 self.pxScale= 1 return self.theData = newAscii sz=3 success=False while sz<20: try: self.qr = QRCode(sz, errLevel) self.qr.addData(self.theData) self.qr.make() success=True break except TypeError: sz += 1 if not success: LOGERROR('Unsuccessful attempt to create QR code') self.qrmtrx = [[0]] return self.qrmtrx = [] self.modCt = self.qr.getModuleCount() for r in range(self.modCt): tempList = [0]*self.modCt for c in range(self.modCt): tempList[c] = 1 if self.qr.isDark(r,c) else 0 self.qrmtrx.append(tempList) self.setPreferredSize(prefSize) def getModuleCount1D(self): return self.modCt def setPreferredSize(self, px, policy='Approx'): self.pxScale,rem = divmod(int(px), int(self.modCt)) if policy.lower().startswith('approx'): if rem>self.modCt/2.0: self.pxScale += 1 elif policy.lower().startswith('atleast'): if rem>0: self.pxScale += 1 elif policy.lower().startswith('max'): pass else: LOGERROR('Bad size policy in set qr size') return self.pxScale*self.modCt return def getSize(self): return self.pxScale*self.modCt def sizeHint(self): sz1d = self.pxScale*self.modCt return QSize(sz1d, sz1d) def paintEvent(self, e): qp = QPainter() qp.begin(self) self.drawWidget(qp) qp.end() def drawWidget(self, qp): # In case this is not a white background, draw the white boxes qp.setPen(QColor(255,255,255)) qp.setBrush(QColor(255,255,255)) for r in range(self.modCt): for c in range(self.modCt): if not self.qrmtrx[c][r]: qp.drawRect(*[a*self.pxScale for a in [r,c,1,1]]) # Draw the black tiles qp.setPen(QColor(0,0,0)) qp.setBrush(QColor(0,0,0)) for r in range(self.modCt): for c in range(self.modCt): if self.qrmtrx[c][r]: qp.drawRect(*[a*self.pxScale for a in [r,c,1,1]]) def mouseDoubleClickEvent(self, *args): DlgInflatedQR(self.parent, self.theData).exec_()
class QRCodeWidget(QWidget): def __init__(self, asciiToEncode='', prefSize=160, errLevel=QRErrorCorrectLevel.L, parent=None): super(QRCodeWidget, self).__init__() self.parent = parent self.qrmtrx = None self.setAsciiData(asciiToEncode, prefSize, errLevel, repaint=False) def setAsciiData(self, newAscii, prefSize=160, errLevel=QRErrorCorrectLevel.L, repaint=True): if len(newAscii) == 0: self.qrmtrx = [[0]] self.modCt = 1 self.pxScale = 1 return self.theData = newAscii sz = 3 success = False while sz < 20: try: self.qr = QRCode(sz, errLevel) self.qr.addData(self.theData) self.qr.make() success = True break except TypeError: sz += 1 if not success: LOGERROR('Unsuccessful attempt to create QR code') self.qrmtrx = [[0]] return self.qrmtrx = [] self.modCt = self.qr.getModuleCount() for r in range(self.modCt): tempList = [0] * self.modCt for c in range(self.modCt): tempList[c] = 1 if self.qr.isDark(r, c) else 0 self.qrmtrx.append(tempList) self.setPreferredSize(prefSize) def getModuleCount1D(self): return self.modCt def setPreferredSize(self, px, policy='Approx'): self.pxScale, rem = divmod(int(px), int(self.modCt)) if policy.lower().startswith('approx'): if rem > self.modCt / 2.0: self.pxScale += 1 elif policy.lower().startswith('atleast'): if rem > 0: self.pxScale += 1 elif policy.lower().startswith('max'): pass else: LOGERROR('Bad size policy in set qr size') return self.pxScale * self.modCt return def getSize(self): return self.pxScale * self.modCt def sizeHint(self): sz1d = self.pxScale * self.modCt return QSize(sz1d, sz1d) def paintEvent(self, e): qp = QPainter() qp.begin(self) self.drawWidget(qp) qp.end() def drawWidget(self, qp): # In case this is not a white background, draw the white boxes qp.setPen(QColor(255, 255, 255)) qp.setBrush(QColor(255, 255, 255)) for r in range(self.modCt): for c in range(self.modCt): if not self.qrmtrx[c][r]: qp.drawRect(*[a * self.pxScale for a in [r, c, 1, 1]]) # Draw the black tiles qp.setPen(QColor(0, 0, 0)) qp.setBrush(QColor(0, 0, 0)) for r in range(self.modCt): for c in range(self.modCt): if self.qrmtrx[c][r]: qp.drawRect(*[a * self.pxScale for a in [r, c, 1, 1]]) def mouseDoubleClickEvent(self, *args): DlgInflatedQR(self.parent, self.theData).exec_()