Qt: el framework en C++ para el desarrollo de software multiplataforma
Los desarrolladores de aplicaciones saben bien lo complejo que resulta la creación y estructuración de los distintos componentes. Los componentes listos para usar de las bibliotecas y los frameworks desempeñan un papel muy importante, ya que no solo ayudan a estandarizar el proceso de desarrollo, sino que también lo facilitan. El marco multiplataforma Qt, por ejemplo, reduce la cantidad de trabajo en el desarrollo de interfaces de usuario y en la creación de programas completos, donde además resulta de especial importancia facilitar la colaboración entre programadores y desarrolladores. Todo ello queda garantizado por los componentes como el entorno de desarrollo integrado Qt Creator, un lenguaje declarativo propio y diversos módulos libremente seleccionables.
¿Qué es Qt?
Debido a los problemas que les planteaban las herramientas para el desarrollo de software multiplataforma, Noweger Haavard Nord y Eirik Chambe-Eng comenzaron en1990a desarrollar Qt. Dos años más tarde, crearon la empresa Trolltech, adquirida posteriormente por la multinacional de comunicaciones Nokia y, en 2012, por la compañía de software finlandesa Digia. Así, desde 2014, la filial The Qt Company es la responsable del desarrollo de herramientas y bibliotecas.
A lo largo de los años, Qt ha pasado de ser una sencilla biblioteca de clases a un amplio framework, dejando así tras de sí numerosas actualizaciones en su modelo de licencia. El actual modelo de licencia dual, que brinda al usuario la oportunidad de elegir entre una licencia propietaria o licencias de código abierto GPL y LGPL, hace posible tanto el uso libre como la explotación comercial.
A pesar de que Qt se encuentra programado en C++, se utiliza un preprocesador MOC (Meta-Object Compiler) para ampliar el lenguaje con funciones elementales como el mecanismo de señales y ranuras (signal y slots), que permite la comunicación orientada a eventos entre los objetos del programa. Para ello, antes de la compilación, el preprocesador genera código fuente C++ a partir del código Qt. En consecuencia, las aplicaciones Qt pueden traducirse con los compiladores convencionales de C++, tales como GCC, ICC, MinGW o MSVC. Nuevas versiones de este framework ofrecen además acceso a QML, el lenguaje declarativo propio, el cual aporta ventajas sobre todo en el desarrollo de GUI. Aparte de las soluciones de lenguaje internas, existen distintas vinculaciones de terceros para otros lenguajes de programación, tales como Python, Ruby, Go, Java o PHP.
Con qmake (solución estándar) y Qbs (Qt Build Suite), el framework pone a disposición dos sistemas propios de compilación, aunque también se pueden emplear otros sistemas como CMake. Asimismo, los usuarios cuentan con el entorno propio de desarrollo integrado Qt Creator, que permite entre otras cosas la edición de código y el acceso rápido a los componentes seleccionados.
Resumen de los componentes más importantes de Qt
Con el tiempo, Qt se ha ido convirtiendo en un framework cada vez más completo. De este modo, no solo se ha trabajado en aumentar la calidad del entorno de desarrollo integrado Qt Creator y la compatibilidad con más lenguajes y plataformas, sino también en brindar a programadores y desarrolladores una gama amplia de funciones. Así, el equipo de Qt confiere desde siempre una gran importancia a abarcar también campos de aplicación específicos de los sectores de la computación de escritorio, así como de los dispositivos móviles.
Puesto que solo una pequeña parte de las aplicaciones basadas en Qt están destinadas a todas las funciones, el framework empezó a dividirse en módulos a partir de su versión 4. Los módulos pueden seleccionarse y combinarse libremente, lo que otorga una gran versatilidad en el desarrollo tanto al equipo Qt como a los usuarios. Con la versión 5, el equipo Qt introdujo una división más en los módulos, diferenciándolos en módulos básicos (Qt Essentials) y módulos complementarios para aplicaciones especiales (Qt Add-ons).
Qt Essentials
Los Qt Essentials conforman la base de Qt para todas las plataformas. Están disponibles tanto en las plataformas de desarrollo compatibles como en las plataformas finales evaluadas y resultan útiles para gran parte de las aplicaciones desarrolladas. Los siguientes módulos son parte esencial del framework:
Módulo | Descripción |
---|---|
Qt Core | Clase central no gráfica, necesaria para todos los demás módulos. |
Qt GUI | Clase básica para el diseño de interfaces gráficas de usuario. Contiene OpenGL. |
Qt Multimedia | Conjunto de tipos QML y clases C++ para contenido multimedia (audio y vídeo). Diferentes interfaces API para acceder a las funciones de cámara y radio |
Qt Multimedia Widgets | Clases basadas en widgets para la implementación de funciones multimedia |
Qt Network | Conjunto de API para aplicaciones que recurren a redes TCP/IP |
Qt QML | Framework y tipos del lenguaje declarativo QML de Qt |
Qt Quick | Framework declarativo para el desarrollo de aplicaciones altamente dinámicas con interfaces gráficas de usuario personalizadas QML |
Qt Quick Controls 2 | Extensión Qt Quick: tipos QML livianos y muy eficientes, que facilitan la creación de interfaces gráficas |
Qt Quick Dialogs | Extensión Qt Quick: tipos para la creación e integración con diálogos de sistema |
Qt Quick Layouts | Extensión Qt Quick: tipos QML para la disposición de objetos en interfaces desarrolladas |
Qt Quick Test | Framework de prueba para aplicaciones QML donde los casos se escriben como funciones JavaScript |
Qt SQL | Clases para la integración de bases de datos SQL |
Qt Test | Clases para pruebas detalladas de aplicaciones y bibliotecas Qt |
Qt Widgets | Conjunto de elementos UI para la creación de interfaces gráficas de usuario clásicas, basadas en widgets, con Qt Designer |
Como se ha mencionado, se emplearán unos u otros módulos en función de la aplicación. Principalmente, resultarán decisivos los requisitos con los que deba cumplir el proyecto en cuestión, aunque en otros casos serán determinantes las herramientas con las que se desee trabajar; de este modo, se emplearán de forma estándar los módulos Qt Core y Qt GUI si quieres trabajar con qmake. Por el contrario, si eliges Qbs u otro sistema de compilación, no existirá esa dependencia predefinida.
Para la creación de interfaces gráficas de usuario, Qt ofrece también dos posibilidades en cuanto a la elección del módulo central. Por un lado, existe la posibilidad de elegir Qt Designer, el cual pone a disposición un editor WYSIWYG estrechamente relacionado con Qt Widgets; y, por otro, Qt Quick representa una alternativa –incl. diferentes módulos de ampliación– que permite el desarrollo en lenguaje QML.
Qt Add-ons
La etiqueta «Qt Add-ons» aporta a los usuarios de Qt un valor adicional para fines específicos. Mientras que algunos de estos módulos adicionales –como los módulos centrales– han sido concebidos para todas las plataformas de desarrollo y plataformas finales, la mayor parte de estos componentes solo es aplicable a determinadas plataformas. Así, el add-on Qt Bluetooth que garantiza el acceso a hardware bluetooth, solo funciona con aplicaciones para Android, iOS, Linux y macOS. Módulos como Qt Windows Extras, Qt Mac Extras o Qt Android Extras solo funcionan en programas para las plataformas finales correspondientes.
Además, existen tres add-ons únicamente disponibles con la licencia comercial o la licencia GNU-GPLv3:
- Qt Charts: componentes UI para la representación de llamativos diagramas (basados en modelos de datos estáticos o dinámicos).
- Qt Data Visualization: componentes UI para la visualización de datos en 3D.
- Qt Virtual Keyboard: framework para la implementación de diferentes métodos de entrada y teclados virtuales en base a QML (plataformas: Linux, Windows)
Desde la versión Qt 5, existen módulos de valor añadido («Value-Add Modules»), los cuales están disponibles únicamente con la licencia comercial. Entre ellos, se encuentra el módulo Qt para automatización, que contiene diversas bibliotecas y herramientas para el desarrollo de sistemas de automatización como KNX (sistemas domóticos).
Qt Creator
El entorno de desarrollo integrado (IDE) Qt Creator te brinda numerosas herramientas y mecanismos automatizados durante todo el proceso de desarrollo. Así, un asistente te ayuda en la creación de nuevos proyectos, guiándote paso a paso durante el proceso y creando automáticamente todos los archivos necesarios. Además, el IDE acelera la escritura del código. A este respecto, el editor integrado ofrece características como el resaltado de sintaxis, el autocompletado automático de código o la comprobación de errores.
Para los sistemas operativos de Windows (a partir de Windows 7), Ubuntu Linux (a partir de la versión 16.04) y macOS (a partir de 10.10) hay disponibles paquetes binarios para la instalación de Qt Creator (incluido en la descarga de Qt).
Qt Creator integra las siguientes herramientas además del editor de código:
- qmake: es el sistema de compilación estándar de Qt y, como tal, se encuentra integrado en Qt Creator y puede seleccionarse desde el menú. No obstante, el IDE es compatible también con otros sistemas. Para utilizar Qbs, solo tendrás que abrir un archivo .qbs.
- Qt Designer: Qt Designer es el programa nativo para diseñar y desarrollar interfaces gráficas de usuario con ayuda de Qt Widgets. El editor visual permite colocar y ajustar los widgets como se desee.
- Qt Linguist: las aplicaciones pueden localizarse directamente en Qt Creator. Desarrolladores, traductores y gestores de entregas encontrarán aquí las herramientas apropiadas.
- Qt Assistant: con Qt Assistant, Qt Creator brinda un acceso rápido a documentación oficial del framework. Para ello, se dispone de una función de ayuda.
Desarrollo de software con señales y ranuras en Qt
Gracias a las vinculaciones con Python, Ruby, Go, etc., Qt es compatible con diversos lenguajes. El lenguaje nativo del framework continúa siendo en todo caso C++, aunque la extensión de este lenguaje orientado a objetos a través del procesador MOC permite disfrutar de nuevos aspectos y paradigmas, como el mecanismo de señales (signals) y ranuras (slots). El concepto permite una comunicación orientada a objetos entre los componentes de programa y representa una alternativa versátil a las funciones directas de «callback». De este modo permite, por ejemplo, la vinculación de objetos o módulos sin necesidad de que estos se conozcan.
Qt es el artífice del concepto señal-ranura, y lo ha acuñado de forma decisiva a lo largo de los años. Actualmente, otros muchos frameworks y bibliotecas, como Flow, utilizan también este modelo de vinculación.
Una señal es un mensaje que envía un objeto en cuanto entra un evento determinado. Por su parte, una ranura es una función común que puede vincularse a una señal para que se ejecute siempre que se recibe dicha señal. Es posible vincular una señal a varias ranuras, de modo que se ejecuten varias funciones como resultado de un único evento. Asimismo, este concepto permite la vinculación de varias señales a una sola ranura, en cuyo caso se ejecutará la misma función con varios eventos.
Las señales y las ranuras ayudan a incorporar una función orientada a eventos en las interfaces gráficas de usuario de las aplicaciones. No obstante, en Qt no tendrás que perder el tiempo creando vinculaciones señal-ranura una a una, ya que muchas de las clases del framework ofrecen acceso a diversas señales y ranuras predefinidas. Aunque, si lo deseas, también tendrás la posibilidad de crearlas personalmente.
¿Cómo funciona el lenguaje declarativo QML propio de Qt?
Desde la versión 4.7, Qt cuenta con el lenguaje declarativo propio QML, caracterizado, entre otros, por tener una sintaxis similar a JSON así como por ser compatible con los imperativos de JavaScript. Sin embargo, lo más importante es la descripción declarativa de los elementos de la GUI, responsable de la claridad del código. De este modo, QML aúna oraciones de tipo declarativas e imperativas en un único lenguaje de programación, brindando al desarrollador un amplio abanico de posibilidades. Si has elegido el módulo Qt Quick, dispondrás con Qt Quick Compiler de la herramienta adecuada para la compilación del código QML en el lenguaje nativo C++. Además, podrás utilizar la herramienta de diseño del mismo nombre (Qt Quick Designer) en Qt Creator para trabajar con componentes QML predefinidos.
QML pone de manifiesto sus ventajas especialmente en el desarrollo de GUI. Gracias a la considerable sencillez de su sintaxis y a la compatibilidad con JavaScript, ofrece a los desarrolladores un acceso notablemente mejor que C++. De este modo, pueden crearse sin problema interfaces gráficas de usuario realizadas en JSON a través de la exportación desde Photoshop, lo cual acelera sustancialmente el proceso de desarrollo. Aun cuando, en teoría, también resulta posible escribir todo el programa en QML, este lenguaje declarativo rara vez se usa en la programación de la lógica de la aplicación.
QML ha hecho que la creación de UI a través de widgets resulte innecesaria en muchos aspectos. Este lenguaje declarativo pone de manifiesto sus ventajas sobre todo con animaciones, maquetaciones completamente personalizadas y componentes de control (portátil, pantalla táctil, etc.) Por el contrario, con los elementos de control tradicionales de escritorio, como la barra de menús, la barra de herramientas o los componentes de «arrastrar y soltar», los widgets son una mejor solución, por lo que su utilización en entornos clásicos de escritorio sigue estando ampliamente extendida.
¿En qué plataformas funciona Qt?
Qt es compatible con diversas plataformas de 32 y 64 bit. Para poder utilizar el framework, no se necesitará más que GCC o cualquier otro compilador. Para la utilización de Qt Quick, se necesitará aparte Open GL, DirectX o cualquier otra interfaz para la generación de imágenes. El equipo de desarrolladores ha realizado la siguiente lista oficial de plataformas compatibles con la versión actual de Qt:
Ventajas | Versión | Compilador |
---|---|---|
Windows | 10, 8.1, 7, UWP (Universal Windows Platform) | MSVC 2017, MSVC 2015, MinGW 5.3 |
Linux/X11 | openSUSE 42.2, Red Hat Enterprise Linux 6.6 y 7.2, Ubuntu 16.04 | GCC (a partir de la versión 4.8), ICC |
Android | A partir de la versión 4.1 | GCC, MinGW 5.3 |
macOS etc. | macOS (a partir de la versión 10.11), iOS 10 y 11, tvOS 10 y 11, watchOS 3 y 4 | Clang (Apple) |
Sistemas embebidos | Embedded Linux, Embedded Linux (Boot2Qt), QNX 6.6.0 y 7.0, INTEGRITY 11.4.4 | GCC |
¿Dónde se aplica Qt?
El proyecto de software más grande conocido en el que se utiliza el framework Qt es KDE Plasma (anteriormente llamado KDE Plasma Workspaces). Se trata de una serie de entornos de escritorio –desde la versión 5, convertido en un único entorno versátil– de la comunidad open source de KDE para distintos dispositivos (equipos de escritorio, portátiles, netbooks, tabletas y teléfonos inteligentes). Las disposiciones y los elementos de control de las diferentes variantes de escritorio están perfectamente adaptados a los requisitos de cada equipo gracias a Qt.
Otros ejemplos relevantes de software basados en Qt demuestran la versatilidad de los escenarios de aplicación del framework:
Multimedia:
- El programa de edición de fotos Adobe Photoshop Elements
- El programa de edición de fotos Adobe Photoshop Album
- El reproductor multimedia gratuito VLC Media Player
- La aplicación para Linux del reproductor de música en streaming Spotify
Comunicación:
- La edición Linux de la herramienta de comunicación Skype
- El servicio de mensajería instantánea Telegram
- El software de conferencias TeamSpeak
Intercambio de archivos:
- La plataforma P2P Marabunta
- El gestor de descargas de KDE KGet
- El cliente de BitTorrent Transmission
Herramientas de diseño en 3D:
- El software de modelado en 3D Adobe Muse CC
- El software de virtualización en 3D
- El software CAD, Auto Q3D
Juegos:
- Monkey Island
- Dust Racing 2D
Otros:
- El programa de maquetación Scribus
- El software de matemáticas Mathematica
- El software de notación y composición Sibelius
En resumen: un framework flexible para múltiples proyectos multiplataforma
Qt es un framework tradicional que se ha adaptado constantemente a los requisitos de las interfaces gráficas de usuario actuales. No en vano, esta compilación de herramientas escritas en C++ es una de las soluciones para el desarrollo de interfaces gráficas de usuario independientes más aclamadas desde que se lanzara su primera versión hace más de veinte años. Responsables de esta fama son, sobre todo, herramientas como Qt Creator o el lenguaje declarativo QML –implementado en las versiones más recientes–, los cuales no solo optimizan el proceso de trabajo en general, sino que también facilitan la colaboración entre diseñadores y programadores.