关于此项功能在于参考了Umi-OCR的开源软件,生成QRCODE类型的二维码,以及相关的解码手段。在生成阶段主要通过 :
import qrcode
直接pip即可,指令为pip install qrcode;而在解码阶段则使用的是:
import zxingcpp
注意指令为pip install zxing-cpp:
界面简要
代码合集:
import cv2
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QHBoxLayout, QLineEdit, QPushButton, \
QWidget, QFileDialog
from PyQt5.QtGui import QPixmap, QMouseEvent
from PyQt5.QtCore import Qt
import sys
import qrcode
from PIL import Image
import zxingcpp
class ClickableLabel(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
self.qr_image_path = None
def set_qr_image_path(self, path):
self.qr_image_path = path
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton and self.qr_image_path:
save_path, _ = QFileDialog.getSaveFileName(self, "保存二维码", "qrcode.png",
"Images (*.png *.xpm *.jpg *.jpeg *.bmp)")
if save_path:
img = Image.open(self.qr_image_path)
img.save(save_path)
print(f"二维码已保存至: {save_path}")
else:
super().mousePressEvent(event)
class QRCodeApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("二维码生成与扫描")
self.setGeometry(300, 300, 800, 600)
self.initUI()
def initUI(self):
# 设置主布局
main_layout = QVBoxLayout()
# 二维码生成部分
generate_layout = QHBoxLayout()
self.input_text = QLineEdit(self)
self.input_text.setPlaceholderText("输入要编码的文本")
self.generate_btn = QPushButton("生成二维码", self)
self.generate_btn.clicked.connect(self.generate_qrcode)
generate_layout.addWidget(self.input_text)
generate_layout.addWidget(self.generate_btn)
# 显示生成的二维码
self.qr_label = ClickableLabel(self)
self.qr_label.setAlignment(Qt.AlignCenter)
self.qr_label.setText("二维码生成后显示在此处")
# 二维码扫描部分
scan_layout = QHBoxLayout()
self.scan_btn = QPushButton("选择二维码图片", self)
self.scan_btn.clicked.connect(self.scan_qrcode)
self.scan_result = QLabel(self)
self.scan_result.setAlignment(Qt.AlignCenter)
self.scan_result.setText("扫描结果显示在此处")
scan_layout.addWidget(self.scan_btn)
scan_layout.addWidget(self.scan_result)
# 添加各部分到主布局
main_layout.addLayout(generate_layout)
main_layout.addWidget(self.qr_label)
main_layout.addLayout(scan_layout)
# 创建主窗口
container = QWidget()
container.setLayout(main_layout)
self.setCentralWidget(container)
def generate_qrcode(self):
text = self.input_text.text()
if not text:
self.qr_label.setText("请输入有效的文本")
return
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(text)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img_path = "generated_qrcode.png"
img.save(img_path)
self.qr_label.set_qr_image_path(img_path)
pixmap = QPixmap(img_path)
self.qr_label.setPixmap(pixmap)
import cv2
def scan_qrcode(self):
file_path, _ = QFileDialog.getOpenFileName(self, "选择二维码图片", "", "Images (*.png *.xpm *.jpg *.jpeg *.bmp)")
if file_path:
try:
# 使用 cv2 加载图像
image = cv2.imread(file_path)
if image is None:
self.scan_result.setText("无法加载图像")
return
# 使用 zxingcpp 解码图像
img = zxingcpp.read_barcodes(image)
if img:
result = img[0].text
self.scan_result.setText(f"扫描结果: {result}")
else:
self.scan_result.setText("无法读取二维码")
except Exception as e:
print(e)
self.scan_result.setText(f"读取错误: {e}")
else:
self.scan_result.setText("未选择文件")
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = QRCodeApp()
ex.show()
sys.exit(app.exec_())
解释:
1. ClickableLabel
类
这是一个自定义的 QLabel 类,用于显示生成的二维码图像,并在用户点击时保存该图像。
set_qr_image_path(self, path)
: 设置二维码图像的路径。mousePressEvent(self, event)
: 处理鼠标点击事件,当左键点击时,如果有二维码图像路径,则打开文件保存对话框,保存二维码图像。
2. QRCodeApp
类
这是主窗口类,继承自 QMainWindow,包含二维码生成和扫描的所有功能。
__init__(self)
: 初始化主窗口,设置窗口标题和大小,并调用initUI()
方法设置界面。initUI(self)
: 设置主界面的布局,包括输入文本、生成按钮、二维码显示区域、扫描按钮和扫描结果显示区域。generate_layout
: 水平布局,包含文本输入框和生成按钮。qr_label
: 用于显示生成的二维码,是ClickableLabel
的实例。scan_layout
: 水平布局,包含扫描按钮和显示扫描结果的标签。
3. 生成二维码功能
generate_qrcode(self)
:- 获取输入的文本,如果文本为空,显示提示信息。
- 使用
qrcode
库生成二维码图像,并保存到本地文件generated_qrcode.png
。 - 设置
qr_label
显示生成的二维码图像,并将图像路径存储在qr_label
中。
4. 扫描二维码功能
scan_qrcode(self)
:- 打开文件选择对话框,选择要扫描的二维码图片。
- 使用 OpenCV (
cv2
) 加载图像文件。 - 使用
zxingcpp
库解码二维码图像。 - 显示解码结果,如果解码失败,显示相应的错误信息。