做个生成和扫描二维码的windows小应用

来源:互联网 发布:unity3d 做个黑洞 编辑:程序博客网 时间:2024/05/29 08:58

想做一个视频聊天的程序,因为用到了编码和解码,所以几天一直在自学ffmpeg。无从下手便从最经典的output_examples.c代码看起。着手重写一遍才发现,很多很多API和宏定义都完全不一样了,结合APIChanges
和度娘坑坑洼洼地写了几天快写完了,昨天凌晨手残忘记保存关机了,全没了。不过无所谓了,差不多理解了(强行安慰自己)。在这几天,花了一天时间用qt做了个二维码的小程序,生成二维码用的是libqr(好像是一个日本人做的库),解码用的是QZXing,虽然对二维码原理不是特别清楚,但是靠着强大的三方库还是完成了。现在贴下主要的mywidget.cpp代码,写的比较烂,希望大神不要嘲笑我这个菜。
下面贴出的是部分最主要的代码,完整的源码打包在http://download.csdn.net/download/qq_26654257/10115655,资源2分。

#include "mywidget.h"#include "ui_mywidget.h"#include <QImage>#include <QPixmap>#include <QDebug>#include "qr.h"#include <QFile>#include <QFileDialog>#include <QMessageBox>QImage saveImage;QImage openImage;MyWidget::MyWidget(QWidget *parent) :    QWidget(parent),    ui(new Ui::MyWidget){    cam = new QCamera(this);//Qt5才有的类,操作摄像头的类    vfinder = new QCameraViewfinder;//Qt5才有的类,显示摄像头画面的窗口    vfinder->setGeometry(100, 100, 500, 350);    cam->setViewfinder(vfinder);    imageCapture = new QCameraImageCapture(cam);//Qt5才有的类,截取摄像头一帧画面的类    /*设定时器,过段时间就截取一帧画面扫描是否有二维码*/    m_timer = new QTimer(this);    connect(m_timer, SIGNAL(timeout()), this, SLOT(handleTimeout()));    connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(handleImageCapture(int, QImage)));    pDecoder = new QZXing(QZXing::DecoderFormat_MAXICODE);//QZXing解码器    imageShow = new QLabel;    ui->setupUi(this);}MyWidget::~MyWidget(){    delete ui;}/*libqr库,主要根据你输入的信息生成二维码*/void MyWidget::on_pushButton_clicked(){    int errorCode = QR_ERR_NONE;    QRCode *qr = qrInit(1,QR_EM_8BIT,1,1,&errorCode);//QRCode* qr;    if(qr == NULL)    {        qDebug()<<"errorCode="<<errorCode;    }    QString stringData = ui->input->text();    qrAddData(qr, (const qr_byte_t *) stringData.toStdString().data(), stringData.toStdString().length());    if(!qrFinalize(qr))    {        qDebug()<<"errorCode="<<errorCode;    }    int size = 0;    qr_byte_t *buffer = qrSymbolToBMP(qr,1,5,&size);    if(buffer == NULL)    {        qDebug()<<"errorCode="<<errorCode;    }    saveImage = QImage::fromData(buffer,size);    ui->QR_Show->setPixmap(QPixmap::fromImage(QImage::fromData(buffer,size)));    ui->QR_Show->setAlignment(Qt::AlignHCenter |Qt::AlignVCenter);}void MyWidget::on_pushButton_2_clicked(){   if(ui->pushButton_2->text() == "开始扫描")   {       ui->pushButton_2->setText("关闭扫描");       cam->start();       vfinder->show();       if(!m_timer->isActive())       {           m_timer->start(1000);       }   }   else if(ui->pushButton_2->text() == "关闭扫描")   {       ui->pushButton_2->setText("开始扫描");       cam->stop();       vfinder->hide();       if(m_timer->isActive())       {           m_timer->stop();       }   }}/*截取摄像头画面*/void MyWidget::handleTimeout(){    imageCapture->capture();}/*QZXing扫描截取的图片有没有二维码,有的话解析*/void MyWidget::handleImageCapture(int, QImage image){    QString information = pDecoder->decodeImage(image);    if(!information.isEmpty())    {        ui->label_3->setText(information);        qDebug() << information;    }}/*保存生成的二维码*/void MyWidget::on_pushButton_3_clicked(){    QString filePath = QFileDialog::getSaveFileName(this, tr("保存"), "./", "");    if(!filePath.isEmpty())    {       if(!saveImage.isNull())       {           saveImage.save(filePath);       }       else       {           QMessageBox q;           q.about(this, "Warning", "二维码图片不存在");       }    }    qDebug()<< filePath;}/*从本地打开二维码图片进行扫描*/void MyWidget::on_pushButton_4_clicked(){    QString filePath = QFileDialog::getOpenFileName(this, tr("d打开"), "./", "");    if(!filePath.isEmpty())    {        openImage.load(filePath);        imageShow->setPixmap(QPixmap::fromImage(openImage));        imageShow->show();        QString information = pDecoder->decodeImage(openImage);        if(!information.isEmpty())        {            ui->label_3->setText(information);            qDebug() << information;        }    }}
原创粉丝点击