viernes, 26 de julio de 2013

Creando un componente simple de QML para usar en mapas. Un ejemplo con QT Location en QT 5


Ayer andaba buscando iconos para usar en una aplicación con mapas y me encontré con un recurso bastante interesante llamado Map Icons Designer. Como podréis ver tienen una pinta bastante atractiva y, si seguís viendo su página, encontraréis que por un lado se nos proporcionan los pines y por otro los símbolos.  La solución, evidentemente, es juntar ambas cosas con algo de coherencia y en el caso que se muestra a continuación se hará mediante un componente QML creado a partir de dos imágenes.

Primero un componente QML facilón

La cosa es bastante fácil, sólo hay que posicionar el símbolo sobre el marcador y para ello usaremos la propiedad "anchor": la posición relativa de ambos tendrá el mismo centro horizontal, después alinearemos el borde superior del símbolo al pin pero dándole un margen adecuado.

anchors.top: parent.top
anchors.topMargin: 10
anchors.horizontalCenter: parent.horizontalCenter

Por otro lado, aunque vamos a usar sólo uno de los marcadores que se nos proporcionan, los iconos a situar en el interior los deberemos elegir dinámicamente. Esto lo conseguiremos creando una propiedad, usando "property alias", en la que indicaremos el elemento que queremos.

property alias symbol:symbol.source

Además podemos meter todas las imágenes en un archivo .qrc y darles una alias para facilitar el acceso desde la aplicación. En la captura que hay a continuación se puede ver que hay definidos dos prefijos uno para los pines y otro para los símbolos.


De momento, el componente queda tal y como se muestra aquí:

import QtQuick 2.0

Image {
    property alias symbol:symbol.source
    id: pin
    source: "qrc:/pins/blue"
    Image{
        id: symbol
        anchors.top: parent.top
        anchors.topMargin: 10
        anchors.horizontalCenter: parent.horizontalCenter
    }
} 

Un ejemplo con QT Location

En cuanto a su utilización, para obtener algo similar a la imagen que se encuentra más abajo, puede incluirse dentro en un Map del módulo QT Location, pintándolo a traves de un MapQuickItem:

   
Map {
        id: nmap
        center {
            latitude: -27
            longitude: 153
        }

        zoomLevel: 10
        plugin : Plugin {name : "osm"} 
        MapQuickItem {
            coordinate: nmap.center
            anchorPoint: "0,0"
            sourceItem: Marker{symbol:"qrc:/symbols/car"}
        }
} 
Pero esto nos llevará a pensar que, puestos a usarlo con qtLocation, será mejor si el propio componente es un MapQuickItem, con lo que heredará todas sus propiedades. Además, añadiremos un par de cosas: 
  • Por un lado corregiremos el posicionamiento del elemento. En QML nuestros elementos se posicionan tomando como referencia el vértice superior izquierdo y, como se puede ver, el pin tiene una punta abajo y centrada para indicar el punto exacto en el que se localiza. Esto lo solucionamos indicando lo siguiente:
  
    anchorPoint.x: pin.width/2
    anchorPoint.y: pin.height
  • Además añadiremos un  MouseArea para detectar eventos sobre el marcador. En el ejemplo solo se trata el click pero podrían ponerse más
Por tanto, el componente nos queda así:
  
import QtQuick 2.0
import QtLocation 5.0

MapQuickItem{
    id: root
    property alias symbol:symbol.source
    signal clicked()

    anchorPoint.x: pin.width/2
    anchorPoint.y: pin.height

    sourceItem: Image {
        id: pin
        source: "qrc:/pins/blue"
        Image{
            id: symbol
            anchors.top: parent.top
            anchors.topMargin: 10
            anchors.horizontalCenter: parent.horizontalCenter
        }
    }
    MouseArea{
        anchors.fill:parent
        onClicked: root.clicked()
    }
}
Y podremos usarlo de la siguiente manera::
  
import QtQuick 2.0
import QtLocation 5.0

Rectangle{
    width: 480;
    height: 300;

    Map {
        id: nmap
        width: parent.width
        height: parent.height
        anchors.centerIn: parent

        center {latitude: -27;longitude: 153}
        zoomLevel: 10

        gesture.flickDeceleration: 3000
        gesture.enabled: true
        plugin : Plugin { name : "osm"}

        Marker {
            symbol:"qrc:/symbols/car"
            coordinate{
                latitude:-27
                longitude:153
            }
            onClicked: console.log("clicked!")
        }

        Marker {
            symbol:"qrc:/symbols/food"
            coordinate{
                latitude:-27.1
                longitude:153.1
            }
        }
    }
}

El proyecto en GitHub 

 Para terminar sólo queda decir que el proyecto está disponible en GitHub, lo tenéis aquí. Se debe tener en cuenta que hay que descargar a parte los iconos, el autor no permite la redistribución, y que se trata de un proyecto en QT5 por tanto hay  que compilar QT Location por nuestra cuenta, ya que es un módulo externo.

lunes, 22 de julio de 2013

Transifex. Haz que la comunidad traduzca tus aplicaciones

Pongamos que tienes una aplicación y empiezas a distribuirla. Seguramente la habrás hecho en inglés para poder llegar a más gente. Si además has utilizado algún sistema de traducción, cosa que deberías hacer siempre, seguramente habrás metido el español como segundo idioma. Así pues, tendrás una aplicación con todo lo necesario para incluir todos los lenguajes posibles y habrá llegado  el momento de pedir ayuda: necesitas traductores.

domingo, 21 de julio de 2013

Blog en obras. Volviendo a Blogger

Voy a hacer un nuevo intento de retomar el blog. Esta vez abandonando la web en Drupal y volviendo a Blogger. La razón es sencilla, no tengo tiempo para mantener actualizado el sitio, instalar las últimas versiones de los módulos que uso para prevenir fallos de seguridad, etc.

Así que ando copiando poco a poco los artículos que desde finales del 2010 había publicado y, con un poco de suerte, eso se ira mezclando con otros nuevos.

domingo, 23 de diciembre de 2012

¡Maldito puente!

Pasamos bajo el arco y miré mi reloj. Habíamos completado la primera vuelta y marcaba 59:59.

- Una hora justa – dije- Si mantenemos el ritmo podemos bajar de dos horas – David asintió y yo sabía que el hombre de rojo que se nos había pegado los últimos tres kilómetros lo había oído también
Iba a ser difícil pero la cosa pintaba mejor que en la media de Valencia. Al menos a mitad de carrera no había nada que recuperar, sólo mantener el ritmo y confiar en poder apretar un poco al final. Llegamos a la marca del kilómetro once y pulsé el botón de vuelta.
- Hemos hecho este kilómetro en 5:29 – La gente parecía haberse puesto nerviosa al comenzar la segunda vuelta. David contestó que había que mantener pero el de rojo parecía acelerar y el otro no quería dejar que se fuera. Supe lo que iba a pasar y continué – Yo no voy a poder ir a más de esto, pilla un ritmo cómodo que puedas mantener hasta el final - Era su primera media maratón.

jueves, 10 de noviembre de 2011

Dfilebrowser 1.1 para Plasma Active

Nueva versión de Dfilebrowser disponible para Plasma Active. Esta vez la compilación corre sobre Open Suse. Las novedades se corresponden con mejoras en la usabilidad y la experiencia de usuario al manejar la aplicación.

Dfilebrowser 1.1 on Plasma Active

Dfilebrowser 1.1
  • La vista por defecto para tablets es una lista.
  • Colores alternantes para las filas en las listas de archivos
  • Aumentado el tamaño disponible para la rejilla de iconos del modo de vista "iconview"
  • Mejoras en el modo de vista de lista con detalles de archivo: mejoras en la distribución de las columnas
  • Bugfix: en Plasma Active sobre Open Suse los archivos no se abrían al hacer "tap`"