本人最近在用Qt編寫程序,需要用編寫二維碼識別功能。在網上搜尋一番,找到了QZXing。配置過程中確實出了一大把汗,這里我寫這篇文章記錄配置方法,替后人省一把汗吧!
我的開發環境:MSVC2010 + Qt5
從這里下載最新版的QZXing_sourceV2.3.zip,解壓之后得到的是源代碼,里面有一個QZXing.pri文件。理論上用MSVC加載這個pri文件之后這個庫的代碼就會出現在工程的代碼列表中,但是理論歸理論,實際上msvc在加載pri的過程中,彈出一大堆錯誤信息,完全不知所雲,網上找遍了,也沒找出個所以然來。后來發現在Qt Creator中使用QZXing.pri文件就很容易,只要在pro文件,也就是Qt Creator的工程文件中加入
即可。
於是我使用的辦法是,用Qt Creator創建一個dll,msvc2010調用這個dll就可以了。
用Qt Creator創建dll
隨便什么工程,這個工程不需要界面文件。把配置文件里的內容改為:
TARGET = Qr
TEMPLATE = lib(之前這里是app)
SOURCES += main.cpp
include (QZXing/QZXing.pri)
TEMPLATE=lib是關鍵,它表示你創建的是庫文件,而不是exe文件。
然后編寫識別二維碼的函數,將main.cpp里的內容改為:
#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,使用方式如下:
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