亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt實現(xiàn)字符串生成二維碼功能

 更新時間:2022年01月23日 17:10:33   作者:中國好公民st  
這篇文章主要介紹了如何利用Qt實現(xiàn)字符串生成二維碼功能,文中的實現(xiàn)過程講解詳細,對我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下

前言

最近在整理開發(fā)項目中遇到的知識點,發(fā)現(xiàn)了一個特別有意思的功能:使用字符串生成二維碼操作。

下面是實現(xiàn)的效果圖

開發(fā)環(huán)境

WIN10環(huán)境 + VS2017 + Qt 5.14.2 64位開發(fā)環(huán)境

實現(xiàn)步驟

資源包數(shù)據(jù)

說實話我的開發(fā)環(huán)境還真是挺麻煩的~

想要使用Qt使用二維碼功能,必須要外加 "qrencode"庫。針對我目前用的環(huán)境使用cmake編譯了一個dll庫

編譯出來的文件包含了兩個:lib和src,如果跟我的開發(fā)環(huán)境不一致的,可以自行編譯,也是很快的(我發(fā)現(xiàn)camke真是一個好工具呀~)

配置屬性

1:頭文件設(shè)置

2:靜態(tài)庫設(shè)置

說明:根據(jù)上述三張圖片中紅色區(qū)域部分進行設(shè)置。

大家可以發(fā)現(xiàn)我設(shè)置的時候都有一個相同點,全部使用了相對路徑。

一般多個人在做規(guī)模龐大的項目時,都會采用相對路徑,即使每個人將項目放到了不同磁盤,也不會發(fā)生數(shù)據(jù)讀取的問題。

說到了這里,那么我就接著來說一些關(guān)于配置的題外話吧~希望對你有幫助哦!

題外話:既然如此,我們生成的exe也會放到一個單獨的目錄中,假設(shè)我們叫做bin文件

在VS中默認生成的exe會根據(jù)是debug或者release環(huán)境生成到對應(yīng)的文件夾中。當(dāng)前要將兩個環(huán)境合并需要修改配置屬性中的常規(guī)操作

最后,也需要在代碼中設(shè)置,將exe的生成目錄設(shè)置成當(dāng)前路徑,否則在程序中使用相對路徑時,無法找到對應(yīng)文件!

QString qExePath = QCoreApplication::applicationDirPath();
QDir::setCurrent(qExePath);

這兩句話最好放到main.cpp中,讓整個項目生效。

二維碼操作

接下來便是我們的重頭戲了,如何使用字符串生成二維碼啦

1:創(chuàng)建QR操作類用于繪制QImage圖形

定義類:QORCodeOperation

#include <QPainter>
#include <xstring>
class CQRCodeOperation
{
public:
    CQRCodeOperation();
    ~CQRCodeOperation();
    QImage GeneratedGraphics(std::string sData, QSize nsize); //生成圖形
private:
    QPixmap m_imgIcon;
};

函數(shù)(GeneratedGraphics)

傳入指定的字符串以及二維碼的寬度高度,返回圖形的QImage值。

一般情況下我們會將QIamge賦值到QLable上展示。

參數(shù)(m_imgIcon)

QPximap類型的成員變量,主要是繪制圖形,在最開始的顯示效果生可以看出二維碼中間添加了一張圖片,主要用于顯示圖片的。

2:生成二維碼圖形QImage

2.1:定義QImage對象存儲生成內(nèi)容

QImage image(nsize, QImage::Format_RGB32);
image.fill(QColor("#000000"));

QImage存儲根據(jù)設(shè)置的nsize大小的寬度高度構(gòu)造一幅圖像,程序會自動根據(jù)圖像格式對齊數(shù)據(jù),使用32位RGB格式的圖像(0xffrrggbb)

2.2:構(gòu)造繪圖指針

QPainter painter(&image);
if (!painter.isActive())
{
	return image;
}

構(gòu)造QPainter繪制指針,一般當(dāng)傳入的QSize數(shù)據(jù)為0時,是無法進行后續(xù)操作的,也就是isActiva = false

2.3:根據(jù)字符串獲取QRcode類實例

QRcode *qrCode = QRcode_encodeString(sData.c_str(), 1, QR_ECLEVEL_L, QR_MODE_8, 1);

2.4:設(shè)置點畫刷以及背景畫刷

QColor colorForPoint("#FFB6C1");
QColor colorForBackground("#ffffff");

painter.setBrush(colorForBackground);
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, image.width(), image.height());

painter.setBrush(colorForPoint);

2.5:繪制圖形

const double &&s = (qrCode->width > 0) ? (qrCode->width) : (1);
const double &&aspect = image.width() / image.height();
const double &&scale = ((aspect > 1.0) ? image.height() : image.width()) / s;

for (int y = 0; y < s; ++y)
{
	const int &&yy = static_cast<int>(y * s);
	for (int x = 0; x < s; ++x)
	{
		const int &&xx = yy + x;
		const unsigned char &b = qrCode->data[xx];

		if (b & 0x01)
		{
			const double rx1 = x * scale, ry1 = y * scale;
			QRectF r(rx1, ry1, scale, scale);
			painter.drawRects(&r, 1);
		}
	}
}

這里為了偷懶再判斷寬度值時采用了三目運算符操作。

2.6:釋放QRcode指針

QRcode_free(qrCode);

2.7:添加二維碼圖形

其實我們在中間展示的圖片比較小,直接覆蓋到二維碼上就可以了

painter.setRenderHint(QPainter::Antialiasing, true); //抗鋸齒
int nLeft = (nsize.width() - 30) / 2;
int nTop = (nsize.height() - 30) / 2;
QRect rectPng(nLeft, nTop,30,30);
painter.drawPixmap(rectPng, m_imgIcon);

2.8:結(jié)束繪制

painter.end();

到這里具體的二維碼繪制已經(jīng)完成了,對外我們只需要返回存儲繪制數(shù)據(jù)的QImage就可以了。

3:二維碼函數(shù)調(diào)用

CQRCodeOperation dlg;
QImage img = dlg.GeneratedGraphics(sText, QSize(250, 250));
ui.labPng->setPixmap(QPixmap::fromImage(img));

總結(jié)

到這里字符串生成二維碼功能就講解完成了,難度不是很大,只要將環(huán)境配置成功就完成了一般的功能了,剩下的就是根據(jù)你的想法,想要如何展示了。

以上就是Qt實現(xiàn)字符串生成二維碼功能的詳細內(nèi)容,更多關(guān)于Qt字符串生成二維碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++生成key-value鍵值的三種方式總結(jié)

    C++生成key-value鍵值的三種方式總結(jié)

    這篇文章主要為大家詳細介紹了C++中生成key-value鍵值的三種方式,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下
    2023-09-09
  • C++實現(xiàn)數(shù)據(jù)文件存儲與加載

    C++實現(xiàn)數(shù)據(jù)文件存儲與加載

    這篇文章主要為大家詳細介紹了C++實現(xiàn)數(shù)據(jù)文件存儲與加載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C++實現(xiàn)圖的鄰接矩陣表示

    C++實現(xiàn)圖的鄰接矩陣表示

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖的鄰接矩陣表示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • opencv3/C++圖像濾波實現(xiàn)方式

    opencv3/C++圖像濾波實現(xiàn)方式

    今天小編就為大家分享一篇opencv3/C++圖像濾波實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Qt進程和線程QProcess和QThread的使用

    Qt進程和線程QProcess和QThread的使用

    本文主要介紹了Qt進程和線程QProcess和QThread的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • vs運行時報C4996代碼錯誤的問題解決

    vs運行時報C4996代碼錯誤的問題解決

    C4996錯誤的意思:是VS覺得strcpy這函數(shù)不安全,建議你使更安全的函數(shù),那么如何解決呢,本文主要介紹了vs運行時報C4996代碼錯誤的問題解決,感興趣的可以了解一下
    2024-01-01
  • C++類與對象的重點知識點詳細分析

    C++類與對象的重點知識點詳細分析

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲在內(nèi)存中—個可以擁有在某個范圍內(nèi)的可變存儲區(qū)域
    2023-02-02
  • C語言實現(xiàn)關(guān)機小程序

    C語言實現(xiàn)關(guān)機小程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)關(guān)機小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)

    深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)

    本篇文章是對Linux靜態(tài)庫與動態(tài)庫進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++如何調(diào)用已經(jīng)寫好的C接口

    C++如何調(diào)用已經(jīng)寫好的C接口

    如何在C++代碼中調(diào)用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調(diào)用不就可以了,那么我們來測試一下,先看看C++如何調(diào)用C代碼接口的,需要的朋友可以參考一下
    2021-10-10

最新評論