PyQt5实践:如何在QLabel中画图形?

这个问题源自于要在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_()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值