本人最近在用Qt编写程序,需要用编写二维码识别功能。在网上搜寻一番,找到了QZXing。配置过程中确实出了一大把汗,这里我写这篇文章记录配置方法,替后人省一把汗吧!
我的开发环境:MSVC2010 + Qt5
从这里下载最新版的QZXing_sourceV2.3.zip,解压之后得到的是源代码,里面有一个QZXing.pri文件。理论上用MSVC加载这个pri文件之后这个库的代码就会出现在工程的代码列表中,但是理论归理论,实际上msvc在加载pri的过程中,弹出一大堆错误信息,完全不知所云,网上找遍了,也没找出个所以然来。后来发现在Qt Creator中使用QZXing.pri文件就很容易,只要在pro文件,也就是Qt Creator的工程文件中加入
include(QZXing_Sourcev2.3/QZXing.pri)
即可。
于是我使用的办法是,用Qt Creator创建一个dll,msvc2010调用这个dll就可以了。
用Qt Creator创建dll
随便什么工程,这个工程不需要界面文件。把配置文件里的内容改为:
QT += core
TARGET = Qr
TEMPLATE = lib(之前这里是app)
SOURCES += main.cpp
include (QZXing/QZXing.pri)
TARGET = Qr
TEMPLATE = lib(之前这里是app)
SOURCES += main.cpp
include (QZXing/QZXing.pri)
TEMPLATE=lib是关键,它表示你创建的是库文件,而不是exe文件。
然后编写识别二维码的函数,将main.cpp里的内容改为:
#include <QtCore>
#include <cstring>
#include <string>
#include "QZXing.h"
extern "C" Q_DECL_EXPORT bool GetQrStr(const char* file, char* buffer, int buffer_size)
{
QZXing dec;
dec.setDecoder(QZXing::DecoderFormat_QR_CODE);
QString strTmp = dec.decodeImageFromFile(file);
if (strTmp.length())
{
strcpy_s(buffer, buffer_size, strTmp.toStdString().c_str());
return true;
}
return false;
}
#include <cstring>
#include <string>
#include "QZXing.h"
extern "C" Q_DECL_EXPORT bool GetQrStr(const char* file, char* buffer, int buffer_size)
{
QZXing dec;
dec.setDecoder(QZXing::DecoderFormat_QR_CODE);
QString strTmp = dec.decodeImageFromFile(file);
if (strTmp.length())
{
strcpy_s(buffer, buffer_size, strTmp.toStdString().c_str());
return true;
}
return false;
}
执行qmake,然后构建。
在MSVC2010中调用编写好的dll
调用方式有很多种,这里我使用的是QLibrary,使用方式如下:
typedef bool (*fpGetQrStr)(const char*, char*, int);
QLibrary lib("qr.dll");
fpGetQrStr GetQrStr = (fpGetQrStr)lib.resolve("GetQrStr");
if (GetQrStr)
{
char buffer[BUFSIZ] = {0};
if (GetQrStr(QR_IMAGE_PATH, buffer, BUFSIZ))
{
qDebug() << "Content is:" << buffer;
}
else
{
qDebug() << "resolve failure";
}
}
QLibrary lib("qr.dll");
fpGetQrStr GetQrStr = (fpGetQrStr)lib.resolve("GetQrStr");
if (GetQrStr)
{
char buffer[BUFSIZ] = {0};
if (GetQrStr(QR_IMAGE_PATH, buffer, BUFSIZ))
{
qDebug() << "Content is:" << buffer;
}
else
{
qDebug() << "resolve failure";
}
}
注意事项
1、编写类似GetQrStr函数的时候,它的参数以及返回值要是C语言中基本的数据类型,不然可能会引起崩溃。
2、我的Qt Creator调用的编译器也是msvc2010.
相关链接
1、QT实现截图功能并识别其中的二维码
2、QZXing+Opencv+Qt Creater实现二维码,一维码的识别
http://ju.outofmemory.cn/entry/78826