这个问题源自于要在GUI界面上面输出二维码,本文将总结两个方案,各有优劣。
Why do we use QLabel to draw on? The QLabel widget can also be used to show images, and it’s the simplest widget available for displaying a QPixmap.
一、通过在QLabel中添加QPixmap来做画板
在显示二维码过程中,这个方案速度会更快,显示效果更好。
import sys
from PyQt5 import QtGui, QtWidgets
from PyQt5.QtCore import Qt
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.label = QtWidgets.QLabel()
canvas = QtGui.QPixmap(300, 300)
self.label.setPixmap(canvas)#创建canvas,并加入label作为画板。
self.setCentralWidget(self.label)
self.draw_something()#绘图函数
def draw_something(self):
painter = QtGui.QPainter(self.label.pixmap())
brush=QtGui.QBrush()#添加画笔
brush.setColor(QtGui.QColor("black"))
brush.setStyle(Qt.SolidPattern)#纯色背景
painter.setBrush(brush)
painter.drawRect(100,100,50,50)#矩形坐标+尺寸
painter.drawRect(150,150,50,50)
painter.end()
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
参考:https://www.learnpyqt.com/tutorials/bitmap-graphics/这篇文章对这个问题写得非常详细,值得认真阅读。
二、在内存中制图,再将图插入QLabel
这种方法需要先生成图形,再添加到Label。我尝试过这种方案,生成速度会比以一种方案慢一些。调整二维码的图片的大小,显示出来的图片可能模糊。这种方法在网上很好找,如果是对于照片操作添加显然比第一种方案更合适的。
import sys
import io
import qrcode
from PyQt5 import QtGui, QtWidgets, QtCore
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.label = QtWidgets.QLabel()
self.label.setGeometry(QtCore.QRect(0, 0, 390, 390))
self.setCentralWidget(self.label)
def paintEvent(self,paintEvent):
text = "Hello World!"#生成二维码文本
with io.BytesIO() as virtual_file:
qrcode.make(text,border=0).save(virtual_file, format="png")#利用qrcode库生成二维码
virtual_file.seek(0)
img = virtual_file.read()
img = QtGui.QPixmap.fromImage(QtGui.QImage.fromData(img))
self.label.setScaledContents(True)#因为生成的二维码的图片尺寸不确定,需要根据label尺寸调整。
self.label.setPixmap(img)#在label上显示图片
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()