lunes, 5 de febrero de 2018

¿Porqué programar en QML utilizando unik?

Explicaremos cuáles son las ventajas, los pros y los contras de programar aplicaciones QML que funcionen con unik.

Lo primero que debemos tener en claro es que unik es un motor QML precompilado disponible con sus respectivos instaladores para GNU/Linux, Windows, Macos y Android. No es un IDE de Desarrollo, ni un Kit de Desarrollo. unik es un ejecutable que no cumple ninguna funcionalidad más que cargar código fuente QML de distintos origenes establecidos por usted mismo para realizar las acciones establecidas por dicho código cargado y mostrandose en apariencia tál como ese código lo haya definido.

Los Pros

La ventaja principal de programar código QML para hacerlo correr en unik es que el programador no necesita de todo el completísimo IDE de Desarrollo Qt y todos sus Kits. Programar en Qt una simple aplicación QtQuick con el lenguaje C++, QML y JavaScript podría implicar tener que instalar desde 1.2Gb a 5Gb. Si el programador está en Windows y no desea utilizar MinGW, hay que sumar todos los gigas que implica tener que instalar MicroSoft Visual Studio 2010/13/15/17 etc...

El tamaño de unik es de 100 a 120Mb aproximadamente contra todos los gigas mencionados. Esta es la gran ventaja. Simplemente con su editor de texto preferido o solamente con la instalación de Qt Creator que tiene un tamaño de 40Mb, ya se puede crear código QML para ser cargado en unik.

Es ideal para aquellas personas que desean aprender o introducirse en el grandioso mundo de Qt, QtQuick y hacer fabulosas y potentes aplicaciones QML de la manera más rápida y práctica posible. Luego de haber aprendido QML o lograr un buen resultado con QML en unik, puede ir de a poco acercandose a Qt para compilar sus códigos QMLs para crear un ejecutable propio desde cero.

La aplicación unik es de uso libre. Usted no tiene que pagar ningún tipo de costo económico para utilizarlo.

Existe un canal de YouTube en donde el Programador de unik sube ejemplos y tutoriales. Allí tu puedes hacer consultas directamente al programador. También existe el Blogger  https://nsdocs.blogspot.com.ar/ en donde hay tutoriales más explícitos y documentación sobre unik y todos sus módulos. Existen publicaciones en GitHub.com sobre ejemplos y códigos de distíntos módulos disponibles en https://github.com/nextsigner

El proyecto unik está recibiendo mucho apoyo, donaciones por medio del sistema PayPal y se ha transformado en un proyecto sólido que permanecerá en el tiempo y creciendo de manera firme y constante.

El proyecto unik es responsabilidad única y exclusivamente de nextsigner y sus patrocinadores. No hay ninguna empresa detrás con algún fin poco ético. El único fin es generar por medio de esta nueva herramienta, nuevas alternativas y posibilidades de progreso a los Programadores Informáticos. El objetivo es crear un gran comunidad de Programadores QML que puedan desarrollar más y mejor, logrando aplicaciónes modernas, potentes y con todo el estilo que solo Qt y QtQuick pueden lograr.

Los Contras

En la actualidad no existe ningún módulo de unik que pueda asemejarse al editor de códigos QML/JS de Qt.



crear una aplicación sqlite con unik



Nota: Para utilizar este tutorial es necesario unik version 2.5 o superior.

Si aún no conoces QML y te preguntas ¿Porqué y cuáles son las ventajas de programar en QML?, aquí tienes algo de información sobre sus características y ventajas. https://nsdocs.blogspot.com.ar/2018/01/programar-en-qml-cuales-son-sus-ventajas.html

Si te preguntas ¿Porqué programar en QML utilizando unik?, aqui tienes información sobre cuáles son sus Pros y sus Contras. https://nsdocs.blogspot.com.ar/2018/02/porque-programar-en-qml-utilizando-unik.html

En este tutorial se enseñará a crear una aplicacion que consistira en lo siguiente:

1) Crear una ventana principal de aplicación de manera sencilla y rapida con QML.
2) Crear y conectar a una base de datos SQLITE de manera rápida y sencilla con unik.
3) Crear tabla SQLITE.
4) Insertar un registro en la tabla SQLITE.
5) Obtener datos de una tabla SQLITE.

Requisitos para utilizar este tutorial

1) Instalar el unik qml engine. Tamaño 100Mb. desde AQUI
2) Un editor de texto.

Paso 1: Crear carpeta de nuestra aplicación
Por ejemplo qml-sqlite.

Paso 2: Crear el archivo QML principal para la Ventana Principal de nuestra aplicación. El archivo lo crearemos dentro de la nuestra carpeta qml-sqlite y  lo llamaremos "main.qml".

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"
}

Explicación del código

Las primeras 2 lineas importan las librerias que utilizaremos en nuestra aplicación. Por último creamos un elemento QML del tipo ApplicationWindow{} que nos permite abrir o mostrar la ventana principal de nuestra aplicación. Le hemos seteado algunos parametros básicos. Un id de nombre "app", que la ventana sea visible y que se inicie como una ventana maximizada.

Paso 3: Inicializar la base de datos sqlite

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Component.onCompleted: {
        unik.sqliteInit('bd.sqlite')
    }
}


Explicación del código

Hemos agregado un disparador onCompleted que se utiliza para ejecutar un bloque de código cuando un componente ha sido cargado de manera completa. Al terminar de cargarse la ventana principal ejecutara una función de unik. La función sqliteInit() de unik sirve para inicializar una base de datos sqlite. Esta función requiere 1 parametro para el nombre o path absoluto de la ubicación del archivo sqlite que deseamos crear.

Paso 4: Crear una tabla sqlite

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Component.onCompleted: {
        unik.sqliteInit('bd.sqlite')
        var sql='CREATE TABLE IF NOT EXISTS tabla(
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        nombre TEXT,
                        edad NUMERIC
                )'
        unik.sqlQuery(sql);
    }
}


Explicación del código

Creamos una variable JavaScript del tipo string llamada "sql". Esta variable contiene la sentencia SQL necesaria para crear nuestra simple tabla de ejemplo llamada "tabla". Luego ejecutamos un método de unik llamado sqlQuery(). Esta función ejecuta la sentencia SQL preparada en el string mencionado.

Paso 5: Insertar un registro

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Component.onCompleted: {
        unik.sqliteInit('bd.sqlite')
        var sql='CREATE TABLE IF NOT EXISTS tabla(
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        nombre TEXT,
                        edad NUMERIC
                )'
        unik.sqlQuery(sql);

        sql='INSERT INTO tabla(nombre,edad)VALUES(\'Juan\', \'40\')'
        unik.sqlQuery(sql);        
    }
}

Explicación del código

Creamos o redifinimos el valor de la variable JavaScript llamada "sql". En este caso la sentencia SQL que utilizaremos es la que se utiliza para insertar un registro en una tabla. Volvemos a ejecutar el método de unik sqlQuery().

Hemos ingresado en la base de datos, dentro de la tabla llamada "tabla", los siguientes datos: En la columna nombre el dato "Juan" y en la columna edad el dato "40".

Paso 6: Obtener datos de la tabla

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Text{
        id: datos
        width: app.width/2
        anchors.centerIn: parent
        font.pixelSize: 30
        wrapMode: Text.WordWrap
    }

    Component.onCompleted: {
        unik.sqliteInit('bd.sqlite')
        var sql='CREATE TABLE IF NOT EXISTS tabla(
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        nombre TEXT,
                        edad NUMERIC
                )'
        unik.sqlQuery(sql);

         sql='INSERT INTO tabla(nombre,edad)VALUES(\'Juan\', \'40\')'
         unik.sqlQuery(sql);

        var rows = unik.getSqlData('tabla', 'SELECT * FROM tabla', 'sqlite')
        for(var i=0;i<rows.length;i++){
                datos.text += rows[i].col[1]+'\n'
        }

    }
}

Explicación del código

Creamos un elemento QML del tipo Text{} con el id "datos". Este aparecerá centrado en la ventana principal y nos mostrará el nombre obtenido desde la base de datos en la tabla de ejemplo.

Creamos una variable JavaScript del tipo array llamada "rows". Atención! Estamos utilizando un método de unik llamado  getSqlData(). Este método nos devuelve un dato del tipo array de objetos bidimensional. Esto significa que el array "rows" contiene cuál si fuese una grilla o tabla, una clase de matriz de datos. Creamos un bucle "for" para recorrer dicha matriz de datos.

Asignamos un valor a la propiedad "text" del elemento Text{} haciendo referencia al id "datos". El valor que le asignamos son la totalidad de datos que se encuentren en la segunda columna del array o matriz de datos. El rows[i] puede ser rows[0], rows[1], rows[2] ... etc dependiendo de la cantidad de filas que tenga la tabla. El rows[i].col[0] corresponde a la columna "id", El rows[i].col[1] corresponde a la columna "nombre" y el rows[i].col[2] corresponde a la columna "edad".

El Text{} de id "datos" irá mostrando repetidas veces el nombre "Juan" por cada vez que se ejecute la aplicación de este ejemplo.

Paso 7: Ejecutar la aplicación del tutorial en unik

Desde el sistema operativo GNU/Linux, Windows o Macos, hay que ejecutar unik con 2 de los siguientes parámetros:

Explicamos lo que ejecutaremos
unik [param 1=-folder] [param 2=folder location]

Modo de ejecución final de Ejemplo en GNU/Linux
/home/nextsigner/Escritorio/unik.AppImage -folder /home/nextsigner/Escritorio/qml-sqlite

Modo de ejecución final de Ejemplo en Windows
"C:\Program Files (x86)\unik\unik.exe" -folder C:/Users/qt/Desktop/qml-sqlite

Modo de ejecución final de Ejemplo en Macos
/Applications/unik.app/Contents/MacOS/unik -folder /Users/qt/Desktop/qml-sqlite

Mas info: nextsigner@gmail.com

unik download

Descargar:Descargar Unik

unik v1.51 windows 32bit

Librerías: Sqlite, MySql, WebView y Multimedia QtAV and VLC-Qt.

unik v1.48 gnu/linux 64bit

Librerías: Sqlite, MySql, WebView y Multimedia.

unik v1.51 Macos 10.11 o superior

Librerías: Sqlite, MySql, WebView y Multimedia.

sábado, 3 de febrero de 2018

unik documentation

Unik Documentation



1 Command Line Parameters List



1.1 -folder

This parameter to be used for run your app from a local folder with qmls files.
Require: 2 parameters
Issue: unik.exe -folder=[local-qml-folder-location]
Example: For run the main.qml and others qml files from a local folder, this command line load all qml files from the dir location.
Run: unik.exe -folder=C:/remoteFolder


1.2 -remoteFolder in reparation

This parameter to be used for download and make a qml folder files and run your app downloaded if main.qml exist into this remote folder.
Require: 3 parameters
Issue: unik.exe -remoteFolder [remote-qml-folder-location] [string array files split by "main.qml|file2.qml|file3.qml"] [local-qml-folder-location-to-make-if-not-exist]
Example: For run the main.qml and others qml files from a remote folder, this command line download all qml files to the dir destination.
Run: unik.exe -remoteFolder=http://unikdev.net/unik/unik-bot-1 "main.qml" "C:/remoteFolder"
Note: This parameters is will implemented for a next version of unik 1.49

1.3 -git

This parameter to be used for run your app downloading a git project.
Require: 1 parameters
Issue: unik.exe -git=[url of git project]
Example: For run the semitimes-m1 from Github.com. Semitimes-M1 is a Qml Clock developed by @nextsigner. More info https://github.com/nextsigner/semitimes-m1.
Run: unik.exe -git=https://github.com/nextsigner/semitimes-m1.git


Set unik Configuration

Note: When the cfg.json file not exists unik run the unik-laucher loading all *.ukl files from the unik work space.

unik when is starting load a config file. The config file is config.json and file location is [system documents][unik documents folder]/cfg.json. Example: /home/nextsigner/Documents/unik/config.json

Note: This file cfg.json change the unik start state while this file exists. You can start the unik application on normal or standar mode cleaning the cfg.json file.

Set cfg.json for -folder

Json Struct:{"arg0":"-folder=[folder]"}
Json Example:{"arg":"-folder=/home/nextsigner/Desktop/app"}


Set cfg.json for -remoteFolder

Json Struct:{"arg0":"-remoteFolder=[remote folder]", "arg1": "[source code file list]", "arg2":"[local folder to save remote files]"}
Json Example:{"arg0":"-remoteFolder=http://yourdomain.com/qml-app-folder/", "arg1": "main.qml|Form.qml|View.qml", "arg2": "/home/nextsigner/Desktop/my-remote-app"}

Set UKL file links for launch apps

A UKL file is a link for launch a Unik Qml Application. You can make files with ukl extension for launch you app from the unik-launcher. The ukl file should has your unik params separated with space character. For example its a ukl content for launch the ritme qml app.

-git=https://github.com/nextsigner/ritme.git -folder=/home/nextsigner/Documentos/unik/ritme

This ukl file when is launched from the unik-launcher, first update ritme from github then run ritme from the ritme folder.

2 Unik Functions

This function data description and all detaills, will published with a correctly way when @nextsigner will have free time or is receibing any colaboration or donation. This project does not have a lot help. After the publication of de unik qml engine in release version, this documentarion will be updated.

void setUnikLog(QString l);
void ukClose(QQuickCloseEvent *close);
void engineExited(int n);
void engineQuited(QObject*);

//Funciones del OS
int getScreenWidth();

//Funciones del Sistema Unik
void setWorkSpace(QString ws);
void definirCarpetaTrabajo(QString et);

bool folderToUpk(QString folder, QString upkName, QString user, QString key, QString folderDestination);
bool carpetaAUpk(QString carpeta, QString nombreUpk, QString usuario, QString clave, QString carpetaDestino);
bool downloadRemoteFolder(QString urlFolder, QString list, QString dirDestination);

bool mkUpk(QByteArray folder, QByteArray upkName, QByteArray user, QByteArray key, QByteArray folderDestination);
bool upkToFolder(QByteArray upk, QByteArray user, QByteArray key, QByteArray folderDestination);
bool isFree(QString upk);
bool loadUpk(QString upkLocation, bool closeAppLauncher, QString user, QString key);
bool downloadGit(QByteArray url, QByteArray localFolder);
void restartApp();
void restartApp(QString args);
bool run(QString commandLine);
void salidaRun();
void salidaRunError();
void finalizaRun(int e);
void log(QByteArray d);
void sleep(int ms);
QString getPath(int path);

    0= Return the App Executable File Name
    1= Return the App Executable Path Location
    2= Return the Location of Temp OS Folder
    3= Return the Location of Documents OS Folder
    4= Return the Location of App Data Folder
    5= Return the App Current Folder / Working Directory / Current Path
    6= Return the Current Desktop OS Folder
    7= Return the Current Home OS Folder


QString encData(QByteArray d, QString user, QString key);
QString decData(QByteArray d0, QString user, QString key);
QQuickWindow *mainWindow(int n);
void setProperty(const QString name, const QVariant &value);
QVariant getProperty(const QString name);
bool isRPI();

//Funciones Network
QByteArray getHttpFile(QByteArray url);
void httpReadyRead();
bool downloadZipFile(QByteArray url, QByteArray ubicacion);
void sendFile(QString file, QString phpReceiver);
void uploadProgress(qint64 bytesSend, qint64 bytesTotal);
void downloadProgress(qint64 bytesSend, qint64 bytesTotal);
void sendFinished();

//Funciones Sqlite
bool sqliteInit(QString pathName);
bool sqlQuery(QString query);
QList<QObject *> getSqlData(QString query);
bool mysqlInit(QString hostName, QString dataBaseName, QString userName, QString password, int firtOrSecondDB);
void setMySqlDatabase(QString databaseName, int firtOrSecondDB);

//Funciones de Sistema de Archivos
void cd(QString folder);
void deleteFile(QByteArray f);
bool setFile(QByteArray n, QByteArray d);
QString getFile(QByteArray n);
bool mkdir(const QString path);
QString getUpkTempPath();
QString getUpksLocalPath();
bool fileExist(QByteArray fileName);

bool createLink(QString execString,  QString arguments, QString lnkLocationFileName, QString description, QString workingDirectory);

//Funciones Varias
QString toHtmlEscaped(QString htmlCode);
void crearPDF(QString captura, QString url, int orientacion);
int frameHeight(QObject *window);
int frameWidth(QObject *window);

Entrada destacada

Aplicación QtQuick con Unik - Texto a Voz en Windows

Hemos publicado un nuevo video sobre Texto a Voz en Windows mediante la creación de una aplicación del tipo QtQuick con Unik.