Qt+QZXing編寫識別二維碼的程序


本人最近在用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)

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;
}

執行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";
    }
}

注意事項

1、編寫類似GetQrStr函數的時候,它的參數以及返回值要是C語言中基本的數據類型,不然可能會引起崩潰。
2、我的Qt Creator調用的編譯器也是msvc2010.

相關鏈接

1、QT實現截圖功能並識別其中的二維碼
2、QZXing+Opencv+Qt Creater實現二維碼,一維碼的識別

http://ju.outofmemory.cn/entry/78826


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM