InicioGlosarioSignals_SlotsWidget Categorías del FAQVisitantes en linea:0 Visitantes de hoy:3 Total de visitantes:46552 |
Haciendo pruebas e intentando compilar Qt para s60 comenze a probar ZoneMinder Viewer sobre s60. Creo que a Qt para s60 todavía le falta mucho pero funciona :) . Actualmente disponemos de QtCore, QtTest, QtGui, QtNetwork, QtScript, QtSvg y QtXML para hacer nuestras aplicaciones sobre s60. Debido a que la versión de escritorio de zmviewer usa tambien Webkit y QtSql me vi obligado a sacar este soporte y a pensar en alternativas como webservices en REST. El build system de ZMViewer es cmake, asi que tuve que pasarlo a qmake para poder compilar para s60 debido a que no encontre la manera de poder hacerlo con cmake. Las primeras pruebas fueron muy sastifactorias debido a que la parte principal de zmviewer funciona perfectamente y el rendimiento en el dispositivo móvil fue muy bueno. Para las primeras pruebas lo que hice fue crear una widget con una sola camara reutilizando solo el core de zmviewer y estaticamente le agregue una camara de mi zoneminder. Cuando logre una version usable publicaré el código. Por ahora un video en http://www.youtube.com/watch?v=Oq2c7PYfPy8 Compilar el driver de mysql para Qt4 en windows me ha llevado más tiempo de lo que habia pensado, esto en GNU/Linux es algo sumamente sencillo. Primero debemos tener algunas cosas:
Al instalar este paquete debemos decirle al instalador que la instalación sea "custom" y debemos decirle que instale los encabezados o seleccionamos todo y listo :) . Yo lo instale en c:\mysql
Para esto debemos hacer lo siguiente:
C:\>cd MySQL
C:\MySQL>cd lib C:\MySQL\lib>cd opt C:\MySQL\lib\opt>c:\mingw-utils\bin\reimp -d libmysql.lib C:\MySQL\lib\opt>c:\mingw\bin\dlltool -k --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a El binario reimp lo pueden conseguir de mingw-utils, yo lo bajé de aquí: http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=61599&release_id=126568 y lo descomprimi como puede verse en c:\mingw-utils ( el archivo es un tar.gz )
cd C:\Qt\4.4.0\src\plugins\sqldrivers\mysql
Y listo con eso debería funcionar. Espero sea útil
qmake -o Makefile "INCLUDEPATH+=c:\mysql\include" "LIBS+=-LC:\mysql\lib\opt -lmysql" mysql.pro make Hay veces que se tiene la necesidad de marcar ciertos eventos en un calendar widget y Qt nos provee una forma muy fácil de hacerlo. Esta clase de ejemplo aclara todo. Lo único que hago es extender QCalendarWidget y agregarle un método appendDate que marcará nuestros eventos( sacado del core de zmviewer ) Ademaś utilizo el método setDateTextFormat( const QDate & date, const QTextCharFormat & format ) de QCalendarWidget para setear el formato que quiera ( por ahora solo un background en amarillo y el texto subrayado )
class CameraEventCalendar : public QCalendarWidget{ public: CameraEventCalendar( QWidget * parent ): QCalendarWidget ( parent ){}; void appendDate( const QDate & date ){ QTextCharFormat fmt; fmt.setBackground( QBrush( Qt::yellow ) ); fmt.setToolTip(tr("Click here to view events of this day")); fmt.setFontUnderline( true ); setDateTextFormat( date , fmt ); m_eventsDateList.append( date ); } QList <QDate> eventsDateList() const{ }; Por lo que utilizar este widget sería tan sencillo como:
//instanciar CameraEventCalendar * cameraEventsCalendar = new CameraEventCalendar( this ); // a modo de ejemplo instanciar un modelo // que su fuente de datos es la tabla Events QSqlTableModel * model = new QSqlTableModel ( this , QSqlDatabase::database () ); model->setTable ( "Events" ); model->select(); //recorrer el modelo y setear los eventos al calendario for ( int i = 0 ; i < m_model->rowCount(); i++ ){ cameraEventsCalendar->appendDate ( model->record( i ).value( "StartTime" ).toDate() ); }
leo | Qt-src | 3 Julio, 4:39pm
| Comentar acerca de esto
El otro día me vi en la necesidad de hacer que un texto sea vertical... Leyendo un poco antes de empezar a programar me encontre con este FAQ en Qt La idea es muy sencilla solo dibujar un texto y rotarlo 90 grados en el paintEvent, o sea siempre que el widget sea dibujado. Acá dejo un ejemplo para hacer esto: #include <QApplication> class VerticalText : public QWidget void paintEvent(QPaintEvent *) int main(int argc, char *argv[])
Ahora bien, este widget es muy sencillo si queremos cambiar el texto deberiamos hacer algo así:
text.text = "Otro texto vertical" text.repaint();
leo | Qt-src | 2 Junio, 12:09pm
| Comentar acerca de esto
Bueno este paso que por supuesto está documentado en Qt es muy sencillo: Primero vamos a donde tenemos instalado o tenemos los fuentes de qt:
cd /directorio/de/qt-x11-opensource-src-4.4.0/src/plugins/sqldrivers/mysql
Luego solo llamamos a qmake con dos variables para evitar errores: INCLUDEPATH = donde buscará el include mysql.h LIBS = donde buscará la librería de mysql para enlazar Esto quedaría algo así en ubuntu/kubuntu:
qmake -o Makefile "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib -lmysqlclient_r" mysql.pro
Y luego:
make && make install
leo | Qt-doc | 29 Mayo, 11:26am
| Comentar acerca de esto
La versión Qt4.4 ha incorporado el fabuloso webkit. WebKit es un proyecto open source para armar un motor para un navegador web. Asi mismo, webkit es el motor de safary y un muchas aplicaciones populares en OS X. WebKit nacio de un branch de KHTML. Gracias a esto podremos renderizar páginas web con solo estas lineas de código:
#include <Qt/QtGui> #include <QtWebKit/QWebView> int main(int argc, char *argv[]) return app.exec(); ¿No les parece impresionante? A mi si :p También dedicaré un espacio a mi proyecto favorito. ZMViewer es un front-end de zoneminder ( http://www.zoneminder.com ) el cual es un sistema de video vigilancia exelente. Hoy lanze una nueva versión del zmviewer, en esta versión incorporé una nueva clase para manejar el stream, más que nada para leer los boundary, ya que zoneminder envia frames del tipo: Content-Type: multipart/x-mixed-replace;boundary=ZoneMinderFrame , lo que significa que cada "--ZoneMinderFrame" viene un paquete. La versión anterior de zmviewer hacia esto un poco desprolijo. Ahora creo que con la nueva versión esto será casi perfecto :); para esto agregue una clase llamada QMultiPartReader ya que creo que puede leer casi cualquier tipo de frames multipartes. ZMViewer permite lo siguiente:
La página del proyecto esta en http://sourceforge.net/projects/zmviewer
Hoy, Nokia y Trolltech anunciaron en que estaban de acuerdo en que Nokia haga una oferta pública para adquierir Trolltech. Aunque como dicen en la carta pública la adquisición se encuentra en una fase muy temprana. Aseguran que Qt y Qtopia seguiran por el mismo camino. Luego de tanto tiempo y con un poco de perdida de información del blog, qtblog a vuelto a ponerse en funcionamiento. De a poco iré armando este blog nuevamente. Saludos
leo | General | 18 Enero, 4:14pm
| Comentar acerca de esto
Se agrego una nueva sección llamada recursos en la cual se pondrá código, widgets, plugins, etc y con la que también se presentó un nuevo widget llamado SLineEdit. El link se encuentra en la parte derecha de la página.
leo | General | 21 Febrero, 5:14pm
| Comentar acerca de esto
Este pequeño artículo surge de una necesidad mía de poder mostrar un número calculado ( por ej. int total = 23 + 6 ) en un QLabel, QLineEdit o un widget en especial. Entonces el tema acá es pasar de número(int,float,double) a QString, porque para setear el texto de un QLabel usamos la funcíon setText ( &QString ). Mostraré dos formas posibles de hacer esto y una tercera usando simplemente "C". De int,float,short o double a QString.QString nos nos provee de el método sobrecargado setNum() el cual nos devuelve un QString del número pasado; de la siguiente manera: QString numero;
int total = 23 + 6; numero = numero.setNum( total ); // numero = "29" QString flotante; float total2 = 23 / 6.00; flotante = flotante.setNum( total2 ); Además se puede hacer lo mismo con QString con el método estático sobrecargado number(), el cual funciona exactamente a setNum con la diferencia de ser estático. Ejemplo:
QString numero = QString::number( 55 ); // numero vale "55" La última forma es con C y muy sencillo también con la función sprintf() (que se encuentra definida en stdio.h), ejemplo:
char cadena[50]; sprintf(cadena, "%6d", 125); // La cadena tendra el contenido " 232" sprintf(cadena, "%6.2f", 442.2); // La cadena tendra el contenido "332.20" sprintf(cadena, "%04x", 127); // La cadena tendra el contenido "007f" Ahora de QString a número.No detallaré mucho en esto porque es todavía más fácil. QString posee funciones para pasar QString a int,unsignerd int (uint), long,etc. las cuales son:
int toInt ( bool * ok = 0, int base = 10 ) const // a int double toDouble ( bool * ok = 0 ) const // a double float toFloat ( bool * ok = 0 ) const // a float long toLong ( bool * ok = 0, int base = 10 ) const // a Long
/* etc */
QString num = "22"; int entero = num.toInt(); Por último para lo mismo tendremos las siguientes funciones en C: int atoi(const char *numPtr); double atof(const char *numPtr); long int atol(const char *numPtr); Ejemplo:
QString num= "22"; int entero = atoi(num.toAscii () );
leo | Qt-src | 19 Febrero, 10:38pm
| Comentar acerca de esto
Está es una opción muy buena y fácil de usar. Si no saben utilizar la clase QTextDocument acá le dejo el link a la referencia de la clase: http://doc.trolltech.com/4.2/qtextdocument.html Bueno, voy a suponer que se tiene un QTextDocument listo y andando y que de una forma o otra se tienen datos dentro de él. Manos a la obra: Seguro en algún momento hiciste algo como esto:
QTextDocument * textDoc = new QTextDocument ( this ); Entonces sabiendo que la instancia de QTextDocument es textDoc creamos la función:
void ClasePadre::aPdf() { // no aseguramos de que posea soporte para impresora #ifndef QT_NO_PRINTER // Llamamos un cuadro de dialogo de guardar archivo. QString fileName = QFileDialog::getSaveFileName(this, tr("Exportar a PDF"),QString(), tr("Archivos PDF(*.pdf)")); // Algunas comprobaciones if (!fileName.isEmpty()) { if (QFileInfo(fileName).suffix().isEmpty()) fileName.append(".pdf"); QPrinter printer(QPrinter::HighResolution); // Formato de salida = PDF printer.setOutputFormat(QPrinter::PdfFormat); // que imprima en fileName printer.setOutputFileName(fileName); // Imprimimos el PDF!!! textDoc->print(&printer); }//fin if #endif }
leo | Qt-src | 3 Noviembre, 11:24pm
| Comentar acerca de esto
Este pequeño artículo está orientado para quien empieza a programar en Qt. Solo describe sus herramientas y da un breve pantallazo al mundo en Qt. Primero seguro quieres instalar las Qt y o te preguntas ¿qué son las librerías Qt?. Antes de empezar a programar es bueno saber que las Qt de trolltech poseen amplia documentación y varias aplicaciones que nos ayudaran un montón. A continuación pasaré a describir el punto anterior: Documentación y aplicaciones
Con él por el momento podrás ver la documentación tanto de la API de Qt como las de las demás aplicaciones que seguiré nombrando. Más tarde, cuando ya tengas tu aplicación en funcionamiento en Qt, tal vez quieras integrarlo a tu aplicación para mostrar tu propia ayuda.
Con él podremos generar fácilmente nuestra interfaz gráfica de usuario con solo arrastrar y soltar. Es decir ponemos y sacamos widgets mediante la ayuda del mouse.
Con él podremos internacionalizar nuestra aplicación, es decir esta herramienta nos ayudará a traducir nuestra aplicación a los idiomas que deseemos.
Una herramienta fundamental a la hora de generar projectos. Con él generaremos fácilmente el archivo de proyecto y el o los Makefiles a la hora de la compilación. En este link podrán encontrar un pequeña charla y ejemplos que di hace un tiempo
leo | General | 18 Octubre, 1:28pm
| Comentar acerca de esto
Esta versión de Qt se encuentra todavía en desarrollo y en esta siendo muy probada en el desarrollo de KDE 4, los cuales a su vez hacen muchas contribuciones a las Qt. Igualmente puede bajarse el snapshots de www.trolltech.com. Bueno, la verdad la nueva versión que se viene de las Qt implementan muchas cosas nuevas, pero algo que me llamó mucho la atención es una tecnología nueva en Qt, llamada QtDBus. QtDBus en un IPC o sea un mecanismo de comunicación entre procesos que usa a D-BUS desarrollado para Linux. La comunicación entre procesos se realiza con un servidor central, llamado "bus", pero también es posible la comunicación directa entre aplicaciones. Con esto por ejemplo las aplicaciones podrían preguntar por la existencia de otras aplicaciones o servicios, y activarlos a demanda. QtDBus ha sido implementado en un módulo llamado por el mismo nombre QtDBus (http://doc.trolltech.com/4.2/qtdbus.html) y su las interfaces de su clases no son muy complicadas para quienes ya han programado en Qt. En KDE 4 se ha implementando esta tecnología que reemplaza a DCOP. Pueden ver http://conference2006.kde.org/conference/talks/27.php, un artículo escrito por Thiago Macieira en la aKademy 2006, unos de los principales responsables de QtDBus.
leo | General | 27 Septiembre, 10:42am
| Comentar acerca de esto
Este simple ejemplo consiste en llamar a un par de funciones de prueba y llamar a un formulario hecho en Qt Designer, por lo que primero hay que crearlo. Bueno el código es el siguiente:
import com.trolltech.qt.core.*; import com.trolltech.qt.gui.*; class Prueba{ }
Para compilarlo primero va a ver que bajar las QtJambi en www.trolltech.com y luego compilar la clase Prueba.java algo así:
export LD_LIBRARY_PATH=/usr/share/qtjambi-1.0:$LD_LIBRARY_PATH
export PATH=/usr/share/qtjambi-1.0/bin:$PATH export CLASSPATH=/usr/share/qtjambi-1.0/qtjambi.jar:. javac Prueba.java Obviamente hay que reemplazar /usr/share/qtjambi-1.0 por el directorio en donde está instalado las qtjambi.
leo | Qt-src | 17 Septiembre, 4:13pm
| Comentar acerca de esto
Se ha presentado una nueva versión de Qt que permitirá utilizar las bondades de la misma en Java. Por ahora está disponible solo una versión de prueba para su descarga, la cual por ahora es gratis pero no es software libre. Esta versión de las Qt para Java lleva el nombre de Jambi. Puedes conseguir más información sobre esto en el sitio web de la compañia trolltech, en el cual podrás encontrar el "papel-blanco"(whitepaper) en formato pdf para su descarga, el cual contiene una muy buena introducción.
leo | General | 26 Agosto, 2:18am
| Comentar acerca de esto
Habremos notado que al escribir una clase para que trabaje con las Qt y pueda usar señales y slots tendremos que agregar algo así:
class miclase { Q_OBJECT public slots: /*...*/ signals: /*...*/ };
¿Pero qué es todo esto?Podemos notar que tanto Q_OBJECT, public slots y signals no forman parte del ANSI C++ y ¿porquñe nuestro compilador lo compila?. Si vamos al código fuente de las Qt podremos ver que estos elementos están definidos como macros. En GNU/Linux dicho fichero puede verse en /usr/share/qt4/include/Qt/qobjectdefs.h en Qt versión 4 y en /usr/share/qt3/include/qobjectdefs.h en Qt versión 3, cabeceras que importamos indirectamente. En este archivo vamos a ver algo así:
/*...*/ # define slots # define signals protected /*...*/ #define Q_OBJECT \ public: \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ virtual void *qt_metacast(const char *); \ QT_TR_FUNCTIONS \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ private: /* tmake ignore Q_OBJECT */ #define Q_OBJECT_FAKE Q_OBJECT /*... Corte el codigo por razones obvias */
Entonces podemos ver que el compilador nunca nos dará error al compilar debido a estas macros. Pero ahora se preguntaran ¿cómo hacen las Qt para relacionar las clases mediantes las señales y slots?. Muy sencillo "MOC", el Meta Object Compiler es el que parsea los archivos cuyas clases tienen definida la macro Q_OBJECT e ignarará las que no la tienen. Entonces este agarrará el código fuente de la clase y generará código extra a nuestro sistema. Seguro vieron archivos moc_xxx.cpp (xxx es el nombre del archivo) que aparecen al compilar, esto es el código que genera moc. Más adelante hablaré más sobre esto.
/* .. */ QApplication qtblog ( argv , argc ); qWarning("Bienvenido al Blog de Qt ");
leo | General | 8 Julio, 11:13pm
| 1 comentarios
|
AmigosOkularKDE Qt on Freenode LugOroVerde ggerman
|