1. 程式人生 > >QT中實現二維碼圖片生成

QT中實現二維碼圖片生成

Linux環境下QT中實現二維碼生成有兩種方法,這兩種方法都需要用到開源的程式碼--qrencode。第一種方法是下載qrencode原始碼後,將其移植到目標板子上,然後在程式中包含其路徑進行使用;第二種方法是將qrencode原始碼新增到自己的程式中,直接呼叫使用。本文使用的第二種方法進行生成二維碼圖片。

         qrencode是開源的二維碼QR碼編碼庫,主要C語言編寫的,這樣方便移植到各種平臺下。QR Code碼特點如圖一所示。

                                                                                   圖一 QRCode碼特點

         本文使用的是qrencode-3.4.4原始碼進行試驗,首先下載qrencode-3.4.4.tar.gz原始碼(原始碼下載地址:http://download.csdn.net/download/aileen5150/9381705),解壓tar xvzf qrencode-3.4.4.tar.gz,然後進入qrencode-3.4.4資料夾執行以下幾個步驟:

         1.將qrencode原始碼中的(*.h  *.c)加入到工程中;
         2.將原始碼中的config.h.in檔案修改成config.h並加入工程;
         3.在QT的pro檔案中新增DEFINES += HAVE_CONFIG_H 定義全域性巨集定義;
         4.重新定義 MAJOR_VERSION、MICRO_VERSION、MINOR_VERSION、VERSION,重新定義的方法:找到#undef MAJOR_VERSION位置,在其下面定義#define MAJOR_VERSION 1,其他幾個也這麼定義;

這樣修改後,就可以在程式中使用qrencode來生成二維碼。包含的檔案如圖二所示。

                                      圖二 程式中需要包含的檔案

使用方法:

        QRcode *qrcode;  //二維碼資料結構
        //2:生成的二維碼版本二,生成的二維碼影象是25x25,QR_ECLEVEL_Q  容錯等級,具體可以參考此函式的原始檔
        qrcode = QRcode_encodeString("http://www.baidu.com/", 2, QR_ECLEVEL_Q, QR_MODE_8, 0);

        最後要將此二維碼結構轉換為二維碼圖片,大部分情況下可以使用開源的圖形庫libpng來生成png圖片。我們這裡省事點不需要移植libpng這個開源庫,使用QT的QPainter來完成二維碼圖片的繪製。在QRcode結構體中,qrcode->data包含了二維碼影象的資訊,其中每個資料中的bit0位代表了點的顏色,1表示黑色,0表示白色。則我們畫圖時先將畫布背景色設定為白色,然後將為1的點畫成黑色,為零的點不畫。具體程式碼如下:

/*
生成二維碼圖片
*/
void PasswordSetting::GenerateQRcode(QString tempstr)
{
QRcode *qrcode; //二維碼資料
//QR_ECLEVEL_Q 容錯等級
qrcode = QRcode_encodeString(tempstr.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
qint32 temp_width=ui->label_5->width(); //二維碼圖片的大小
qint32 temp_height=ui->label_5->height();
qint32 qrcode_width = qrcode->width > 0 ? qrcode->width : 1;
double scale_x = (double)temp_width / (double)qrcode_width; //二維碼圖片的縮放比例
double scale_y =(double) temp_height /(double) qrcode_width;
QImage mainimg=QImage(temp_width,temp_height,QImage::Format_ARGB32);
QPainter painter(&mainimg);
QColor background(Qt::white);
painter.setBrush(background);
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, temp_width, temp_height);
QColor foreground(Qt::black);
painter.setBrush(foreground);
for( qint32 y = 0; y < qrcode_width; y ++)
{
for(qint32 x = 0; x < qrcode_width; x++)
{
unsigned char b = qrcode->data[y * qrcode_width + x];
if(b & 0x01)
{
QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);
painter.drawRects(&r, 1);
}
}
}
QPixmap mainmap=QPixmap::fromImage(mainimg);
ui->label_5->setPixmap(mainmap);
ui->label_5->setVisible(true);
}

QRcode_encodeString("http://www.baidu.com/", 2, QR_ECLEVEL_Q, QR_MODE_8, 0); 生成的二維碼如圖三所示。

 

             圖三 生成的二維碼圖

參考文章:

http://blog.csdn.net/liyuanbhu/article/details/44599031

http://blog.csdn.net/gaobobo138968/article/details/38149421

http://blog.csdn.net/liujunpen/article/details/50018559

http://www.tuicool.com/articles/zIJvAf6

http://www.colabug.com/thread-1002792-1-1.html

http://blog.csdn.net/xiexingshishu/article/details/46901379

http://blog.csdn.net/liulina603/article/details/42099121

http://wenku.baidu.com/link?url=aQuG10G785cuZgzm9FeYGAvL38YH04e_i506R-kO0nJLJB2c8kPufjH3HKz5qQgFVcJJdU9oQMWWKwccHGr3DgH3CGSG2SmbJvxBiiDAPS_

原文:https://blog.csdn.net/zhangxufei/article/details/52149892 
 

此外,找到一個在windows、QT下可直接執行的生成二維碼的工程,連結

https://download.csdn.net/download/shishiyouyou/9686541