环境
Qt 5.4.2
QZXing
功能
QT 二维码生成及解析,二维码底部绘制文字
QZXing
- 下载QZXing 并使用QT 编译
编译完成后需要的文件:
源码
1.引入库文件及H文件
2.修改 Pro 文件
新增:
INCLUDEPATH +=$$PWD/qzxing/include
LIBS +=$$PWD/qzxing/libQZXing3.a
DEFINES += ENABLE_ENCODER_GENERIC
3.mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QString sFilePath;
private:
QImage TxtInfoImages(QString message);
QImage QZXInfoImages(QString message);
QImage MergeImages(QImage image1, QImage image2);
private slots:
void on_pushButton_Encode_clicked();
void on_pushButton_Save_clicked();
void on_pushButton_load_clicked();
void on_pushButton_Dncode_clicked();
};
#endif // MAINWINDOW_H
4.mainwindow.cpp
QImage MainWindow::TxtInfoImages(QString message)
{
QImage txtImg(DEF_QRWIDTH, 20, QImage::Format_ARGB32);
txtImg.fill(Qt::white);
QPainter painter; //绘制文字
painter.begin(&txtImg);
painter.setPen(QColor(0, 0, 0));
QFont font = painter.font();
font.setBold(true);
font.setPointSize(12);
painter.setFont(font);
// 计算文字位置,此处为放在二维码右下角
QRect textRect = txtImg.rect();
textRect.setWidth(DEF_QRWIDTH); // 根据二维码大小调整文字宽度
textRect.setHeight(20); // 根据二维码大小调整文字高度
textRect.moveBottomLeft(txtImg.rect().topLeft()+ QPoint(0, 15) ); // 设置文字位置
painter.drawText(textRect, Qt::AlignCenter, message);
painter.end();
return txtImg;
}
QImage MainWindow::QZXInfoImages(QString message)
{
QImage qzxImg = QZXing::encodeData(message
,QZXing::EncoderFormat_QR_CODE
,QSize(DEF_QRWIDTH,DEF_QRHEIGHT)
,QZXing::EncodeErrorCorrectionLevel_H
,true
,false);
return qzxImg;
}
QImage MainWindow::MergeImages(QImage image1, QImage image2)
{
QImage merged(QSize(image1.width(),image1.height() + image2.height()), QImage::Format_ARGB32);
merged.fill(Qt::transparent);
QPainter painter(&merged);
painter.drawImage(QPoint(0, 0), image1);
painter.drawImage(QPoint(0, image1.height()), image2);
painter.end();
return merged;
}
void MainWindow::on_pushButton_Encode_clicked()
{
if(ui->textEdit_EMsg->toPlainText() == "") { return; }
QImage image1 = QZXInfoImages(ui->textEdit_EMsg->toPlainText());
QImage image2;
QImage image3 = image1;
if(ui->textEdit_TxtInf->toPlainText() != "")
{
image2 = TxtInfoImages(ui->textEdit_TxtInf->toPlainText());
image3 = MergeImages(image1,image2);
}
ui->label_EImage->setPixmap(QPixmap::fromImage(image3));
}
void MainWindow::on_pushButton_Save_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this,
"Save File",
sFilePath,
"image Files (*.jpg *.png)");
if("" != fileName)
{
sFilePath = fileName.mid(0,fileName.lastIndexOf("/")+1);
QImage img = ui->label_EImage->pixmap()->toImage();
img.save( fileName, 0, 100);
}
}
void MainWindow::on_pushButton_load_clicked()
{
QString sPath = QFileDialog::getOpenFileName(
this,//指定父窗口
"打开数据文件",//打开文件对话框的标题
sFilePath,//打开目录,"." 表示当前目录
"image Files (*.jpg *.png)"
);
if("" != sPath)
{
sFilePath = sPath.mid(0,sPath.lastIndexOf("/")+1);
QImage image;
image.load(sPath);
ui->label_DImage->setPixmap(QPixmap::fromImage(image));
}
}
void MainWindow::on_pushButton_Dncode_clicked()
{
QImage img = ui->label_DImage->pixmap()->toImage();
if(img.isNull())
{
return;
}
QZXing decode;
decode.setDecoder(QZXing::DecoderFormat_QR_CODE);
decode.setSourceFilterType(QZXing::TryHarderBehaviour_ThoroughScanning|QZXing::TryHarderBehaviour_Rotate);
decode.setSourceFilterType(QZXing::SourceFilter_ImageNormal);
QString info = decode.decodeImage(img);
ui->textEdit_DMsg->setText(info);
}
运行