加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

用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_())

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读