camerawindow.cpp 1.61 KB
#include "camerawindow.h"
#include "ui_camerawindow.h"

CameraWindow::CameraWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CameraWindow),
    hasResolution(false)
{
    ui->setupUi(this);

    cameraSurface = new CameraSurface();
    camera = new QCamera();
    capture = new QCameraImageCapture( camera );
    camera->setViewfinder(cameraSurface);
    camera->setCaptureMode(QCamera::CaptureStillImage);
    camera->start();

    zxing = new QZXing( QZXing::DecoderFormat_QR_CODE, this );

    connect(zxing, SIGNAL(tagFound(QString)), this, SLOT(showResult(QString)));
    connect(cameraSurface, SIGNAL(novoFrame(QByteArray&,int,int)), this, SLOT(frameHandler(QByteArray&,int,int)));
}

CameraWindow::~CameraWindow()
{
    delete ui;
    delete cameraSurface;
    delete camera;
    delete capture;
    delete viewfinder;
    delete zxing;
    delete img;
    delete buffer;
}

void CameraWindow::frameHandler(QByteArray &buff, int w, int h)
{
    if (!hasResolution) {
        img = new QImage( w, h, QImage::Format_RGB32 );
        hasResolution = true;
    }

    u_int32_t* data = (u_int32_t*)buff.data();
    for(int y = 0; y < h; ++y) {
        QRgb* scan = (QRgb*)img->scanLine(y);

        for(int x = 0; x < w; ++x) {
            scan[x] = data[y * w + x];
        }
    }

    zxing->decodeImage( *img, w, h, true );

    QImage imgTmp = img->scaled(w*.30, h*.30);
    ui->label->setPixmap(QPixmap::fromImage(imgTmp));
    buff.clear();
}

void CameraWindow::closeEvent(QCloseEvent *event)
{
    emit close();
    event->accept();
}

void CameraWindow::showResult(QString result)
{
    ui->label_2->setText(result);
}