用Python创建QR码(PyQt)
发布时间:2020-12-20 11:31:58 所属栏目:Python 来源:网络整理
导读:我目前正在使用PyQt4和 qrcode4.0.4. from PyQt4 import QtGui,QtCorefrom PIL.ImageQt import ImageQtimport qrcodeclass QRLabel(QtGui.QLabel): def __init__(self,text=""): super(QRLabel,self).__init__() self.setCode(text) def setCode(self,text="
我目前正在使用PyQt4和
qrcode4.0.4.
from PyQt4 import QtGui,QtCore from PIL.ImageQt import ImageQt import qrcode class QRLabel(QtGui.QLabel): def __init__(self,text=""): super(QRLabel,self).__init__() self.setCode(text) def setCode(self,text=""): self.text = text qrImg = qrcode.make(text) imgQt = ImageQt(qrImg.convert("RGB")) # keep a reference! pixm = QtGui.QPixmap.fromImage(imgQt) self.setPixmap(pixm.scaled(self.size(),QtCore.Qt.KeepAspectRatio)) 正如您所看到的,在屏幕上显示图像之前,有几个障碍需要通过. QR码以RGBA PIL图像开始,然后转换为RGB,然后转换为PIL ImageQt对象,然后转换为QPixmap,然后将QPixmap放置在带有缩放修复的QLabel上. 如果您没有显式存储imgQt引用,则在加载窗口小部件时会出现垃圾. 我的问题是:我能做些什么来改善这一点,因为它似乎涉及到如此多的转换. 解决方法
从qrcode文档中,您可以创建自己的image_factory,这可以让您简化流程.
您只需要子类qrcode.image.base.BaseImage并重新实现new_image,drawrect和save方法.该子类可以包装QImage,因此不需要PIL转换步骤. 更新: 这是一个消除PIL依赖的演示(也是如此,因为我发现PIL因某些输入而崩溃): from PyQt4 import QtGui,QtCore import qrcode class Image(qrcode.image.base.BaseImage): def __init__(self,border,width,box_size): self.border = border self.width = width self.box_size = box_size size = (width + border * 2) * box_size self._image = QtGui.QImage( size,size,QtGui.QImage.Format_RGB16) self._image.fill(QtCore.Qt.white) def pixmap(self): return QtGui.QPixmap.fromImage(self._image) def drawrect(self,row,col): painter = QtGui.QPainter(self._image) painter.fillRect( (col + self.border) * self.box_size,(row + self.border) * self.box_size,self.box_size,QtCore.Qt.black) def save(self,stream,kind=None): pass class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.label = QtGui.QLabel(self) self.edit = QtGui.QLineEdit(self) self.edit.returnPressed.connect(self.handleTextEntered) layout = QtGui.QVBoxLayout(self) layout.addWidget(self.label) layout.addWidget(self.edit) def handleTextEntered(self): text = unicode(self.edit.text()) self.label.setPixmap( qrcode.make(text,image_factory=Image).pixmap()) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) window = Window() window.setGeometry(500,300,200,200) window.show() sys.exit(app.exec_()) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |