{"id":2104,"date":"2012-12-31T16:49:47","date_gmt":"2012-12-31T19:49:47","guid":{"rendered":"http:\/\/realnorth.net\/blog\/?p=2104"},"modified":"2012-12-31T18:48:14","modified_gmt":"2012-12-31T21:48:14","slug":"qzxing-codigos-qr-y-meego","status":"publish","type":"post","link":"https:\/\/realnorth.net\/blog\/qzxing-codigos-qr-y-meego\/","title":{"rendered":"QZXing, C\u00f3digos QR y MeeGo"},"content":{"rendered":"<p><a href=\"http:\/\/code.google.com\/p\/zxing\/\" title=\"ZXing (\"Zebra Crossing\")\" target=\"_blank\">ZXing<\/a> es una biblioteca open source para el procesamiento de c\u00f3digos de barras, la biblioteca ha sido ampliamente portada a varias plataformas, en Qt podemos usar <a href=\"http:\/\/projects.developer.nokia.com\/QZXing\" title=\"QZXing\" target=\"_blank\">QZXing<\/a>, la cual se integra f\u00e1cilmente en Symbian y Harmattan.<\/p>\n<p>En este ejemplo vamos a crear un peque\u00f1o lector de codigos QR, pero QZXing es capaz de procesar muchos otros formatos de codigos de barras, como por ejemplo Data Matrix (V1.1), Aztec Code (V1.2), UPC_E, UPC_A, EAN_8, EAN_13, CODE_128, CODE_39 e ITF entre otros.<\/p>\n<p>Para comenzar, hay que <a href=\"http:\/\/projects.developer.nokia.com\/QZXing\" title=\"QZXing\" target=\"_blank\">bajar<\/a> y agregar QZXing en nuestro proyecto, para ello solo debemos crear una carpeta QZXing en la raiz del proyecto y copiar dentro de ella todos los archivos que conforman QZXing.<\/p>\n<p>Luego la incluiremos en nuestro proyecto agregando la siguiente linea en el archivo <em>.pro<\/em>.<\/p>\n<pre>\r\ninclude(QZXing\/QZXing.pri)\r\n<\/pre>\n<p>A continuaci\u00f3n declararemos la headers de QZXing en el archivo <em>main.cpp<\/em>.<\/p>\n<pre>\r\n#include <QtGui\/QApplication>\r\n#include \"qmlapplicationviewer.h\"\r\n\r\n#include <QZXing.h>\r\n\r\nQ_DECL_EXPORT int main(int argc, char *argv[])\r\n{\r\n    QZXing::registerQMLTypes();\r\n\r\n    QScopedPointer<QApplication> app(createApplication(argc, argv));\r\n\r\n    QmlApplicationViewer viewer;\r\n    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);\r\n    viewer.setMainQmlFile(QLatin1String(\"qml\/qrcodereader\/main.qml\"));\r\n    viewer.showExpanded();\r\n\r\n    return app->exec();\r\n}\r\n<\/pre>\n<p>Lo bueno de QZXing es que se integra f\u00e1cilmente con QML, el primer paso es crear los imports a <em>QtMultimediaKit<\/em> y <em>QZXing<\/em>, luego crearemos un objeto QZXing que sera el encargado de leer la imagen (<em>imageToDecode<\/em>) que el elemento Camera tomara cuando presionemos el bot\u00f3n <em>Scan<\/em>.<\/p>\n<p>Como ver\u00e1n usar e integrar QZXing en un proyecto Harmattan es muy simple, yo no lo he probado en Symbian, pero su integraci\u00f3n y uso es similar, lo \u00fanico que no me ha gustado es como ha quedado el posicionamiento del elemento Camera, primero tuve que usar posicionamiento absoluto en vez de relativo, ya que el elemento Camera no se lleva bien con los anchors, segundo, tuve que aplicar una rotaci\u00f3n de 90\u00b0 ya que el elemento Camera se inicializa en modo landscape y como no encontr\u00e9 ninguna forma de ponerlo en modo retrato decid\u00ed usar la rotaci\u00f3n.<\/p>\n<pre>\r\nimport QtQuick 1.1\r\nimport com.nokia.meego 1.0\r\nimport QtMultimediaKit 1.1\r\nimport QZXing 1.2\r\n\r\nPage {\r\n    id: mainPage\r\n    orientationLock: PageOrientation.LockPortrait\r\n    tools: commonTools\r\n\r\n    Rectangle {\r\n        id:header\r\n        width:parent.width\r\n        height: 72\r\n        z:10\r\n        color:\"#002c78\"\r\n        Text {\r\n            id:title\r\n            text: \"QZXing\"\r\n            anchors.left: parent.left\r\n            anchors.leftMargin: 8\r\n            anchors.verticalCenter: parent.verticalCenter\r\n            color:\"#fff\"\r\n            font.pixelSize: 32\r\n            font.weight: Font.Normal\r\n            font.family: \"Nokia Pure Text\"\r\n            lineHeightMode: Text.FixedHeight\r\n            lineHeight: font.pixelSize * 1.1\r\n        }\r\n    }\r\n\r\n    QZXing {\r\n        id: decoder\r\n        onDecodingStarted: console.log(\"decoding ...\")\r\n        onTagFound: capturedText.text = tag\r\n        onDecodingFinished: console.log(\"decoding finished \" + (succeeded===true ? \"successfully\" : \"unsuccessfully\") )\r\n    }\r\n\r\n    Camera {\r\n        id: camera\r\n        x: -80\r\n        y: -32\r\n        rotation: 90\r\n        width:640\r\n        height: 640\r\n        focus: visible\r\n        captureResolution : \"1024x768\"\r\n        onImageCaptured : {\r\n            imageToDecode.source = preview\r\n            decoder.decodeImageQML(imageToDecode);\r\n        }\r\n    }\r\n\r\n    Image{\r\n        id: imageToDecode\r\n        height: 360\r\n        anchors.left: parent.left\r\n        anchors.leftMargin: 0\r\n        anchors.right: parent.right\r\n        anchors.rightMargin: 0\r\n        anchors.top: header.bottom\r\n        anchors.topMargin: 0\r\n        visible: false\r\n    }\r\n\r\n    Label {\r\n        id:capturedText\r\n        anchors.bottom: scanButton.top\r\n        anchors.bottomMargin: 8\r\n        anchors.horizontalCenter: parent.horizontalCenter\r\n        font.pixelSize: 24\r\n        font.weight: Font.Normal\r\n        font.family: \"Nokia Pure Text\"\r\n        color:\"#333\"\r\n    }\r\n\r\n    Button {\r\n        id:scanButton\r\n        text: \"Scan\"\r\n        anchors.bottom: parent.bottom\r\n        anchors.bottomMargin: 16\r\n        anchors.horizontalCenter: parent.horizontalCenter\r\n        onClicked: {\r\n            camera.captureImage();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Para finalizar una imagen del ejemplo funcionando.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/realnorth.net\/blog\/wp-content\/uploads\/2012\/12\/qr.jpg\" alt=\"QZXing Demo\" title=\"QZXing Demo\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ZXing es una biblioteca open source para el procesamiento de c\u00f3digos de barras, la biblioteca ha sido ampliamente portada a varias plataformas, en Qt podemos usar QZXing, la cual se integra f\u00e1cilmente en Symbian y Harmattan. En este ejemplo vamos a crear un peque\u00f1o lector de codigos QR, pero QZXing es capaz de procesar muchos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[19,25,128,127],"class_list":["post-2104","post","type-post","status-publish","format-standard","hentry","category-development","tag-harmattan","tag-meego","tag-qr","tag-qzxing"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/posts\/2104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/comments?post=2104"}],"version-history":[{"count":22,"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/posts\/2104\/revisions"}],"predecessor-version":[{"id":2128,"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/posts\/2104\/revisions\/2128"}],"wp:attachment":[{"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/media?parent=2104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/categories?post=2104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/realnorth.net\/blog\/wp-json\/wp\/v2\/tags?post=2104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}