[C con Clase] Realizar gráficos con c++ en linux

Jordenys Pérez Feria jferia en uci.cu
Mie Abr 21 15:34:07 CEST 2010


Hola Miguel, con QT puedes usar otra herramienta para la construcción de los Makefile al sistema de construcción al que el trae por defecto (qmake), pero para eso tienes que crear una serie de configuraciones adicionales. Debes tener presente que QT usa el mecanismo "meta-object system" para proveer los "signals-slots" y la "introspección". La introspección posibilita el funcionamiento de los signals y slots y permite a los programadores obtener meta información de las subclases de QObject en tiempo de ejecución, esto entre otras cosas permite que en QT se pueda trabajar con properties, scripting y resuelve de manera elegante temas como la internacionalización entre otras cosas. Como conoces el C++ standar no tiene soporte nativo para la meta-información dinámica que se necesita para el "meta-object systema". En QT se resolvió este problema con una herramienta separada llamada "moc", esta procesa todas las clases que contengan la macro Q_OBJECT y hace que toda la meta-información esté disponible mediante funciones en C++. Las funciones generadas automáticamente por moc si son puro C++ y pueden ser procesadas por cualquier compilador.

 
Todo esto lo explico para que veas con funciona el mecanismo básico:
- cuando ejecutas qmake, este analiza los .pro del proyecto a su vez ejecuta moc y se genera todo el código en C++ adicional para todos los objetos que usan la macro Q_OBJECT, en el directorio donde compilas aparecerá código C++ adicional que comienza con la palabra "moc_" ejemplo de un fichero auto-generado en un proyecto personal: "moc_EnumProperty.cpp"

- luego se generan los makefile teniendo en cuenta además todos los cpp generados automáticamente por moc.

- se llama a un compilador estándar para procesar todo el código nativo y luego al enlazador

Como puedes observar, el objetivo de qmake es facilitar todo este proceso y hacerlo transparente al programador, de todas formas se puede configurar otro sistema de construcción teniendo en cuenta todo lo explicado anteriormente, yo personalmente lo he logrado con SCONS he trabajado con autotools pero no con QT.

En una de las entradas de la ayuda de QT4 viene una entrada donde explican como configurar los .pro para incluir bibliotecas y las cabeceras de estas, además de muchas otras cosas que se logran de forma muy sencilla con qmake.

Por ejemplo, estas líneas indican como se puede adicionar una biblioteca:

LIBS += -L/usr/local/lib -lmylibrary

INCLUDEPATH = /usr/local/include  

Por defecto se reconocen los directorio /usr/lib y /usr/include por lo que no es necesario adicionarlos en qmake.

Por ejemplo, si instalo qwt5-qt4 en ubuntu lo único que tengo que hacer es incluir qwt-qt4 en los LIBS del .pro
LIBS += -lqwt-qt4

y las cabeceras en mi código lo incluyo de la siguiente forma:
#include <qwt-qt4/qwt.h>

no necesitas especificar los directorios donde estos se encuentran porque está instalado en los que reconoce el sistema por defecto.

Saludos, Jordenys.


----- Mensaje original -----
De: "Miguel Olave" <molavec en gmail.com>
Para: "Lista de correo sobre C y C++" <cconclase en listas.conclase.net>
Enviados: Miércoles, 21 de Abril 2010 0:06:27 (GMT-0500) Auto-Detected
Asunto: Re: [C con Clase] Realizar gráficos con c++ en linux

Debido que que se veían bonitos los gráficos del QWT y como quería saber 
como ocupar el Qt4 y el Qt creator seguí esa línea y vi que también 
estaba disponible un paquete con documentación y ejemplos, así que 
después de marearme un poco y que no me compilara porque no encontraba 
las librerías .h (cosa que pensé que iba a hacer por defecto al instalar 
el paquete con synaptics), me di cuenta que había que utilizar unos 
archivos .pri y .pro.Y FUNCIONÓÓÓÓÓ!!! Muchas Gracias Jordenys!!! y 
obviamente a Ricardo Jorge y José por sus respuestas, pues igual voy a 
picar por esas librerías más adelante para comparar.

En fin, ese asunto (el de que no encontrará las librerías) reavivo una 
duda que tengo desde hace mucho tiempo desde que programo C en linux 
(hace tiempo que no lo hacía en serio ya que estaba usando JAVA).

1.- Ahora cuando hago un programa en las que incluyo una librería 
estándar y compilo las detecta y utiliza sin problemas. Sin embargo, no 
siempre fue así. En versiones anteriores de Ubuntu trataba de compilar 
un programa y no las detectaba. Después de mucho rebuscar pude 
incluirlas al agregarlas a la variable de entorno $CPPFLAGS, pero debía 
hacer eso siempre que abria un bash. ¿Como es que C o C++ detecta la 
ubicación de dichas librerías el gcc? ¿Se setea una variable de entorno 
que desconozco?

Nota: Al buscar alguna de las estándar me indica que están en este dir:
> angel$ whereis math.h
> math: /usr/include/math.h

2.- Ahora como necesito usar un librerías Qwt pensé que bastaba 
instalarlas con el Synaptic y sería todo maravilloso y las identificaría 
inmediatamente, pero no fue así. Mi idea para comenzar era instalar las 
librerías Qt + Qt creator + qwt y pronerme a programar, pero al final 
tuve que usar un archivo .pri que venía con el ejemplo que crea muchas 
Variables para indicar las rutas (las librerías del qwt estaban 
finalmente en "/usr/include/qwt-qt4"). Ahora en caso de querer usar un 
Makefile propio (y no ocupar el Qt Creator) ¿cómo puedo incluirlas de 
modo que el compilador las considere, como considera a las librerías 
estándar? (Notesé que el archivo del ejemplo las incluía con #include 
<libreria_qwt.b> y no con las comillas "").

Esta última duda me a traído tenido perdiendo el tiempo desde hace mucho 
y siempre termino rindiéndome a incluirlas una por una desde un Makefile 
o el los mismos programas con #include "<ruta>/archive.h". Desde hace 
mucho en otros programas que he tenido que hacer eso o simplemente 
compilar. Si alguien puediese responder ésto me quitaría una espina que 
tengo clavada de hace tiempo.

Atte.
Miguel.





El 20/04/2010 20:27, Miguel Olave escribió:
> Primero que nada quisiera agradecer sus pronta respuestas a todos ya 
> que muchas son alternativas que "San Google" no fue capaz de entregarme.
> Apenas, pueda les comentó como me fue y cual me resultó.
>
> Miguel.
>
> Jordenys Pérez Feria wrote:
>> Hola Miguel, trabajo en ambientes donde uno de los requisitos 
>> primarios para todos nuestros productos es que las aplicaciones deben 
>> ser multiplataforma (deben funcionar en windows, linux y mac). Este 
>> problema lo resolvemos usando bibliotecas como QT4, que cumple con el 
>> requerimiento de miltiplataforma, excelente rendimiento, está 
>> desarrollada en C++, buena documentación, lgpl, muchas herramientas 
>> para el desarrollo, etc.
>>
>> Para el diseño de una gráfica como la que quieres (2d) en qt4 puedes 
>> heredar de QWidget (clase base para todos los controles gráficos 
>> buttons, lineEdits, etc..) y reimplementar la función virtual void 
>> paintEvent ( QPaintEvent * event )
>>
>> Bueno, los detalles los puedes consultar en la documentación de la 
>> biblioteca.
>>
>> Para esta biblioteca existen una serie de componentes gráficos ya 
>> desarrollados, Gráficos de barra, puntos, pastel, etc... que creo 
>> resuelven tú problema. La biblioteca la puedes descargar de la 
>> siguiente dirección:
>> http://qwt.sourceforge.net/
>>
>> o instalar desde el repositorio de ubuntu “libqwt5-qt4-dev”
>>
>> Para comenzar a trabajar puedes instalar un paquete del repositorio 
>> oficial de ubuntu "qtcreator". Este es un IDE de desarrollo muy 
>> ligero y bastante aceptable, con este paquete se instala 
>> automáticamente las bibliotecas necesarias para trabajar y la 
>> documentación.
>>
>> Si usas otro IDE de desarrollo pues simplemente instalas libqt4-dev y 
>> qt4-dev-tools.
>>
>> El sitio oficial de la biblioteca http://qt.nokia.com/
>>
>> Saludos, Jordenys.
>>
>>
>>
>> ----- Mensaje original -----
>> De: "Miguel Olave" <molavec en gmail.com>
>> Para: Cconclase en listas.conclase.net
>> Enviados: Lunes, 19 de Abril 2010 22:00:51 (GMT-0500) Auto-Detected
>> Asunto: [C con Clase] Realizar gráficos con c++ en linux
>>
>> Hola compañeros.
>>
>>     Voy a tratar de ser bien simple en mi solicitud. Lo que necesito 
>> es saber que librerías podría ocupar para realizar algunos gráficos 
>> con C++. Por lo que he leído obviamente debo hace usos de librerías 
>> de GUI que dependan del sistema operativo pero estoy un poco perdido 
>> y lo que quiero hacer puede que sea simple para quien lo haya 
>> realizado alguna vez y me puedan ahorrar mucho tiempo en la búsqueda.
>>
>> Necesito hacer dos gráficos con algunos arreglos:
>>
>> //este tene que ser una linea continua
>> x[i]=sin(i*2*pi*800/8000.0);
>> t[i]={/*un vector para el tiempo*/}
>>
>> //Este tiene que ser un gráfico de espectro de frecuencias, o sea,
>> //para cada punto una linea vertical
>> magnitud=(sqrt(y[i2].real*y[i2].real+y[i2].img*y[i2].img))*escalamiento;
>> f[i]={/*un vector para la frecuencia*/}
>>
>> Como ven no es mucho distinto de lo que pueda hacer en matlab, pero 
>> me da lata tener que guardar los datos en un txt y gráficar en 
>> Matlab. Además, como uso LINUX para c++ tengo que cambiar de sistema 
>> operativo cada vez que quiero gráficar.
>>
>> Datos relevantes:
>>
>> - Uso Ubuntu (gnome).
>> - Leí que las librerías OpenGL servían para varios Sistemas Operativos.
>>
>>
>> De antemano, muchas gracias por sus consejos.
>>
>>
>> Miguel Angel Olave.
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net 
>>
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net 
>>
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>


_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




Más información sobre la lista de distribución Cconclase