Mostrando entradas con la etiqueta qt. Mostrar todas las entradas
Mostrando entradas con la etiqueta qt. Mostrar todas las entradas

lunes, 27 de junio de 2016

Descargar Qt SQK 5.7 x86_64 para Linux desde Mega - Drive (2016)

Si has intentado descargar el SDK de Qt para linux verás que la pag de descarga está muy lenta. De aquí la podrás descargar para Linux x86_64:

https://drive.google.com/open?id=0B9uuluhrKpGKSmtFekNNU3A3STQ

jueves, 30 de julio de 2015

QtXlsx: Leer y escribir en ficheros .xlsx con Qt

La mejor librería (que he probado) para trabajar con ficheros .xlsx en Qt es QtXlsx.

Para usarla primero debes descargar el src desde aqui:

Si quieres visiar el repo en github:
https://github.com/dbzhang800/QtXlsxWriter


Luego de descargarlo lo descomprimimos en el directorio de nuestro proyecto de Qt


Luego vamos al fichero .pro de nuestro proyecto y agregamos la siguiente linea:

include(QtXlsxWriter-master/src/xlsx/qtxlsx.pri)



Compilas y listo, ya estas listo para el primer ejemplo:
Este código nos permitiría leer las dos primeras columnas de todas las filas.

void Ventana::leerTodo()
{
    QXlsx::Document *docIN= new QXlsx::Document("data.xlsx");
    int nFilas=docIN->dimension().lastRow();

    for (int i = 2; i <= nFilas; ++i) {
        QString nombre  =docIN->read(("A"+QString::number(i)).toString());
        QString apellido=docIN->read(("B"+QString::number(i)).toString());
        
        qWarning()<<"   Nombre  : "<<nombre;
        qWarning()<<"   Apellido: "<<apellido;
        
    }
}

El fichero .xlsx usado es algo así:





viernes, 24 de julio de 2015

Solucionar libgstapp-0.10.so.0 en Fedora Qt Creator

Si al momento de abrir Qt Creator o ejecutar un programa te sale el siguiente código de error:

libgstapp-0.10.so.0: cannot open shared object file: No such file or directory


Entonces debes instalar el paquete gstreamer-plugins-base
con:

dnf install gstreamer-plugins-base

domingo, 19 de julio de 2015

Solucion -lGL Qt Creator Fedora 22

Si cuando intentas compilar tu primer programa de Qt Creator te lanza el siguiente error:
cannot find -lGL


Debes instalar el paquete mesa-libGL-devel desde terminal:


dnf install mesa-libGL-devel

jueves, 23 de abril de 2015

Solución: Ejecución lenta de evaluateJavaScript()

Si cuando intentas ejecutar el método evaluateJavaScript() el método hace que todo se cuelgue por unos momentos es porque el sistema esta evaluando el valor de retorno de la ultima instrucción de javascript e intentando convertirla a un tipo de dato QVariant. Esto ocasiona un costo alto cuando usas jQuery. Puesto que este retorna un objeto de jQuery que luego debe ser evaluado enteramente por Qt lo cual consume mucho tiempo de procesador.

La solución es hacer que la ultima instrucción sea un valor nulo

myWebElement->evaluateJavaScript( myScript + "; null" );
Yo por ejemplo utilizo este método para cargar jQuery en la pag
void BrowserWindow::loadJQuery()
{
  QFile file("jquery.min.js");
  file.open(QFile::ReadOnly);
  weView()->page()->mainFrame()->evaluateJavaScript(file.readAll()+";null");
}

domingo, 12 de abril de 2015

Compilar QupZilla en Fedora

Primero nos descargamos el  src. En este caso lo descargué de rpm.pbone.net
Source: http://rpm.pbone.net/index.php3/stat/26/dist/96/size/3216881/name/qupzilla-1.8.6-3.fc21.src.rpm

Luego instalamos hunspell-devel

yum install hunspell-devel hunspell*


Luego debemos descomprimir el fichero src.rpm




Dentro del directorio descomprimido el habrá otro fichero .tar.gz que debemos descomprimir.



Luego abrimos QtCreator y seleccionamos "Open File or Project" y buscamos el fichero QupZilla.pro








Para evitar el error "libQupZilla.so.1: cannot open shared object file" debes agregar el siguiente texto al FINAL fichero ./lib/defines/defines.pri:

DEFINES *= NO_SYSTEM_DATAPATH




Luego compilas y corres.
Ya con esto deberías tener QupZilla listo para modificar

domingo, 15 de marzo de 2015

Listar ficheros y carpetas con Qt

SI queremos saber los nombres de los ficheros y carpetas dentro de un directorio debemos usar la clase QDir con el método entryList()

QStringList lista=QDir("./Graficos").entryList();

// Imprime todos los ficheros y subdirectorios del directório "Graficos"
qDebug()<<lista;

sábado, 21 de febrero de 2015

QRegExp: explicación rápida y sin marisqueras

Ejemplo #1: Detectar un número de dos dígitos 
"([0-9]{2,2})"
Explicación
[0-9]: Dígito del 0 al 9
{2,2}: Mínimo 2 y máximo 2 (Modifica al anterior que es [0-9]).

Pruebas:
QRegExp rx("([0-9]{2,2})");
rx.indexIn("123");        // Lo encuentra en 0
rx.indexIn("-asd66");   // Lo encuentra en 4
rx.indexIn("6");            // No encuentra

Ejemplo #2: Detectar las x de un polinomio y sus coeficientes
"([0-9]{,}x)"
Explicación
[0-9]: Dígito del 0 al 9
{ , }: Indica que la x puede tener o no un número adelante (cuando el coeficiente es 1 se no es necesario colocarselo)
x: Carácter x

Pruebas:
QRegExp rx("([0-9]{,}x)");  rx.indexIn("2y+3x");        // Lo encuentra en 3
rx.indexIn("2y+345x");    // Lo encuentra en 3
rx.indexIn("2y+x");          // Lo encuentra en 3
rx.indexIn("2y-5");           // No lo encuentra rx.indexIn("6");               // No encuentra

domingo, 8 de febrero de 2015

Ejemplo Qt5 + Postgres

En la entrada anterior expliqué como se configuraba fedora para conectar qt5 con postgres. Ahora aquí se muestra un ejemplo de una aplicación en Qt que se conecta con una BD en postgres.

Primero creamos la BD de ejemplo desde pgadmin3. En este caso se llama BD_UNEG


CREATE DATABASE "BD_UNEG"
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'es_VE.UTF-8'
       LC_CTYPE = 'es_VE.UTF-8'
       CONNECTION LIMIT = -1;
-- Table: persona

CREATE TABLE persona
(
  cedula character varying(20) NOT NULL,
  nombre character varying(50),
  tipo character varying(30),
  estatus character varying(30),
  carrera character varying(30),
  CONSTRAINT persona_pkey PRIMARY KEY (cedula)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE persona
  OWNER TO postgres;

qt postgres

Quedaría así


Ahora agrega algo a la BD. 



NOTA: En este ejemplo la clave de postgres es 123456 y el puerto es 5432

Este es el código en Qt que busca todos los elementos de la tabla persona y los muestra

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QStringList>
#include <QMessageBox>
#include <QSqlQuery>
#include <QSqlRecord>

bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("127.0.0.1");   // Nombre del host
    db.setDatabaseName("BD_UNEG"); // Nombre de la BD
    db.setPort(5432);              // Puerto
    db.setUserName("postgres");    // Usuario
    db.setPassword("123456");      // Contraseña

    // Si esta abierto entonce retorna true
    if (db.isOpen()){
        qWarning() <<"La conexión ya estaba creada";
        return true;
    }

    // Abre la BD
    if (!db.open()) {
        QMessageBox::critical(0, QObject::tr("Database Error"),
                              db.lastError().text());
        return false;
    }
    return true;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << (createConnection() ? "Se crea la conexión :)" : "ERROR al conectar :(");

    QSqlQuery qry;

    qry.prepare( "SELECT * FROM persona" );
     if( !qry.exec() )
       qDebug() << qry.lastError();
     else
     {
       qDebug( "Seleccionado!" );
       QSqlRecord rec = qry.record();
       int cols = rec.count();
       for( int c=0; c<cols; c++ )
         qDebug() << QString( "Columna %1: %2" ).arg( c ).arg( rec.fieldName(c) );

       for( int r=0; qry.next(); r++ )
         for( int c=0; c<cols; c++ )
           qDebug() << QString( "Fila %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
     }

    return a.exec();
}





Recuerda agregar QT += sql en el fichero .pro



Links de interes:
http://www.informit.com/articles/article.aspx?p=1405550


http://www.java2s.com/Code/Cpp/Qt/ConnecttoMySqlwithQSqlDatabaseanddoselectupdateinsertanddelete.htm


http://www.ics.com/designpatterns/solutions/qsqldatabase.html

Qt + Postgresql en Fedora 21

Para usar una bd en postgresql usando Qt en fedora 21 primero debes instalar el driver de postgresql

yum install qt5-qtbase-postgresql

Luego en el proyecto agregar la linea sql en el fichero .pro de nuestro proyecto



Listo :) Ahora puesdes probar el driver usando el siguiente código:



#include <QtCore/QCoreApplication>

#include <QDebug>
#include <QSqlDatabase>
#include <QStringList>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "Available drivers: " << QSqlDatabase::drivers();

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");

    qDebug() << "addDatabase() " << (db.isValid() ? "VALID" : "ERROR");

    return a.exec();
}



Aqui pongo un ejemplo más pulido:

jueves, 5 de febrero de 2015

Libreria GLPK con Qt Creator

Primero debes instalar glpk en tu distribucion de linux
En fedora basta con 
yum install glpk*

Al intentar compilar un ejemplo de glpk en qt creator me mostraba esta falla.


Para corregirlo solo debes agregar la siguiente linea a tu fichero .pro


LIBS += -lglpk



Recompilas y listo. En este caso me muestra la versión de Qt




Este es el ejemplo mostrado

#include "stdio.h"
#include "glpk.h"

int main(int argc, const char *argv[])
{
    printf("GLPK Version: %s\n", glp_version());
    return 0;
}

viernes, 2 de enero de 2015

jueves, 25 de diciembre de 2014

Conectar señales de Qt con funciones en C

La nueva sintaxis de Qt 5 nos permite conectar señales de objetos de Qt con funciones estáticas comunes.

Para ello usamos la siguiente sintaxis:

connect(emisor,  &ClaseDelEmisor::señal,  funcion);

Por ejemplo:


connect(timer, &QTimer::timeout, &f );



Ejemplo:

/** Cuando se vence el tiempo del timer y se envia
     la señal timeout() se ejecuta la función f **/


void f(){
    qDebug()<<"&timer.timeout ----> f()";
}


int main(int argc, char *argv[])
{   
    QCoreApplication a(argc, argv);    
    QTimer *timer = new QTimer();


    // Se conecta la señal timeout con la función f
    timer->connect(timer, &QTimer::timeout, &f );    

    timer->start(1000);    
    return a.exec();
}

Diagrama:



Links:

miércoles, 17 de diciembre de 2014

Mover objetos con transiciones en Qt con QPropertyAnimation

Aqui explicaremos como mover un objeto de Qt de un lugar a otro de la pantalla y que este se valla deslizando:
Basta con crear una animación de movimiento con QPropertyAnimation.


// Se crea la animación 
// el parámetro OBJETO es el objeto que queremos mover
// Puede ser un QLabel, QGraphicsWidget, etc
QPropertyAnimation *animation = new QPropertyAnimation(OBJETO, "pos"); 


// Duración de la animación. El tiempo desde que sale hasta que llega
animation->setDuration(1000); 

// Posición inicial de donde va a partir
animation->setStartValue(QPointF(this->x(), this->y()));

// Posición final a donde va a llegar
// En este caso le estoy diciendo que se mantenga en el mismo
// valor de x pero que varie el valor de Y en 100 px
animation->setEndValue(QPointF(this->x(), this->y()+100));

// Inicia la animación
animation->start(QAbstractAnimation::DeleteWhenStopped);


Este es un ejemplo compilable:

#include <QtCore>
#include <QtWidgets>
#include <QObject>
#include <QCoreApplication>

/** @brief Representa una figura cuadrada **/
class Cuadrado : public QGraphicsWidget
{
public:

    /** Constructor
     *  @param colorDeseado Color que el usuario desea
     *         Puede ser "azul" o "rojo". En caso contrario
     *         la pieza se dibujará gris
     **/
    Cuadrado(QString colorDeseado):QGraphicsWidget(){

        // Asigna el color segun el color deseado
        color= colorDeseado=="rojo"? Qt::red : (colorDeseado=="azul"?
               Qt::blue : Qt::gray);
    }

    ~Cuadrado(){}

    /** Pinta la pieza segun el color **/
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, 
               QWidget *){
        painter->fillRect(rect(), color);
    }

    void mover(qreal xEnd,qreal yEnd){
 // Aqui crea la animación
        QPropertyAnimation *animation = new QPropertyAnimation(this, 
                                                               "pos"); 
        animation->setDuration(8000); // 8 Segundos
        animation->setStartValue(QPointF(this->x(), this->y()));
        animation->setEndValue(QPointF(xEnd, yEnd));
        animation->start(QAbstractAnimation::DeleteWhenStopped);
    }

private:

    /** Color del cuadrado **/
    Qt::GlobalColor color;
};


int main(int argc, char **argv)
{ 
    QApplication app(argc, argv);

    // Creamos un cuadro rojo y uno azul
    Cuadrado *cuadroAzul=new Cuadrado("azul");
    Cuadrado *cuadroRojo=new Cuadrado("rojo");

    // Los movemos a la posición inicial
    cuadroAzul->moveBy(60,10);
    cuadroRojo->moveBy(10,10);

    // Se crea la escena
    QGraphicsScene scene(0, 0,600, 600);

    // Se agrega los cuadros a la escena
    scene.addItem(cuadroAzul);
    scene.addItem(cuadroRojo);

   // Se mueve con animación
    cuadroAzul->mover(200,500);
    cuadroRojo->mover(100,500);

    QGraphicsView window(&scene);
    window.show();
    return app.exec();
}