You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.0 KiB
75 lines
2.0 KiB
from PyQt4.QtGui import * |
|
from PyQt4.QtCore import * |
|
import PyQt4.QtCore as QtCore |
|
import PyQt4.QtGui as QtGui |
|
|
|
import bmp, pyqrnative |
|
|
|
|
|
class QRCodeWidget(QWidget): |
|
|
|
def __init__(self, data = None): |
|
QWidget.__init__(self) |
|
self.setMinimumSize(210, 210) |
|
self.addr = None |
|
self.qr = None |
|
if data: |
|
self.set_addr(data) |
|
self.update_qr() |
|
|
|
def set_addr(self, addr): |
|
if self.addr != addr: |
|
self.addr = addr |
|
self.qr = None |
|
self.update() |
|
|
|
def update_qr(self): |
|
if self.addr and not self.qr: |
|
for size in [4,5,6]: |
|
try: |
|
self.qr = pyqrnative.QRCode(size, pyqrnative.QRErrorCorrectLevel.L) |
|
self.qr.addData(self.addr) |
|
self.qr.make() |
|
break |
|
except: |
|
self.qr=None |
|
continue |
|
self.update() |
|
|
|
def paintEvent(self, e): |
|
|
|
if not self.addr: |
|
return |
|
|
|
black = QColor(0, 0, 0, 255) |
|
white = QColor(255, 255, 255, 255) |
|
|
|
if not self.qr: |
|
qp = QtGui.QPainter() |
|
qp.begin(self) |
|
qp.setBrush(white) |
|
qp.setPen(white) |
|
qp.drawRect(0, 0, 198, 198) |
|
qp.end() |
|
return |
|
|
|
k = self.qr.getModuleCount() |
|
qp = QtGui.QPainter() |
|
qp.begin(self) |
|
r = qp.viewport() |
|
boxsize = min(r.width(), r.height())*0.8/k |
|
size = k*boxsize |
|
left = (r.width() - size)/2 |
|
top = (r.height() - size)/2 |
|
|
|
for r in range(k): |
|
for c in range(k): |
|
if self.qr.isDark(r, c): |
|
qp.setBrush(black) |
|
qp.setPen(black) |
|
else: |
|
qp.setBrush(white) |
|
qp.setPen(white) |
|
qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize, boxsize) |
|
qp.end() |
|
|
|
|