Slots QT

Iniciado por overxfl0w13, 10 Julio 2012, 13:20 PM

0 Miembros y 2 Visitantes están viendo este tema.

overxfl0w13

Estaba buscando documentación de Qt y la verdad es que hay bastante buena, pero no consigo encontrar una buena explicación sobre como hacer mis propios slots. Lo que quiero hacer, es que al pulsar un botón determinado se descargue mediante wget un archivo.

¿ Alguien sabe de algún sitio o puede dar una breve explicación?.

EDIT:  más o menos tengo la idea de como hacerlo pero se me está quedando grande, tengo éste code, pero hay cosas que no me cuadran.

Código (cpp) [Seleccionar]
#include <QtGui>
#include <QObject>

class Clase : public QObject
{
   Q_OBJECT

   public slots:
       void descarga() const;

};

void Clase::descarga() const
{
   system("wget http://overxfl0w.synergize.co");
}

int main(int argc,char *argv[])
{
   QApplication app(argc,argv);
   QPushButton descargar("Overxfl0w");
   Clase slot1;
   QObject::connect(&descargar,SIGNAL(clicked()),&app,SLOT(slot1.descarga()));
   descargar.show();
}



El error es  "referencia a `vtable for Clase` sin definir".

Gracias  :)
[/url]

avesudra

#1
Este es tu problema http://foro-c.com/blog/qt-error-undefined-reference-to-vtable-when-q_object/ tienes que estructurar bien el código en diferentes archivos en Qt , así que me parece que es mejor empezar un proyecto Qt Gui que te estructura las cosas.
PD: Para probar que es eso , sólo quita la macro Q_OBJECT verás como compila.
En cuanto a la explicación , te digo que no sé casi nada de Qt , pero supuestamente para crear tus propios slots es como crear una función miembro dentro de una clase normal y corriente.
¡Un saludo!
Regístrate en

overxfl0w13

#2
Cita de: avesudra en 10 Julio 2012, 13:59 PM
Este es tu problema http://foro-c.com/blog/qt-error-undefined-reference-to-vtable-when-q_object/ tienes que estructurar bien el código en diferentes archivos en Qt , así que me parece que es mejor empezar un proyecto Qt Gui que te estructura las cosas.
PD: Para probar que es eso , sólo quita la macro Q_OBJECT verás como compila.
En cuanto a la explicación , te digo que no sé casi nada de Qt , pero supuestamente para crear tus propios slots es como crear una función miembro dentro de una clase normal y corriente.
¡Un saludo!

Entonces, yo podría hacer la clase en un archivo .hpp, que sería este:

Código (cpp) [Seleccionar]
class Clase : public QObject
{

   public slots:
       void descarga() const;

};


Y el .cpp principal que podría ser este:

Código (cpp) [Seleccionar]
#include <QtGui>
#include <QObject>
#include "slots.hpp"

void Clase::descarga() const
{
   system("wget http://overxfl0w.synergize.co");
}

int main(int argc,char *argv[])
{
   QApplication app(argc,argv);
   QPushButton descargar("Overxfl0w");
   Clase slot1;
   QObject::connect(&descargar,SIGNAL(clicked()),&app,SLOT(slot1.descarga()));
   descargar.show();
   return app.exec();
}


Hasta ahí bien, pero estamos en las mismas de antes, si dejo el Q_OBJECT en la declaración de la clase, sigue dando el mismo error y si lo quito, me dice:
"Object::connect No such slot QApplication::slot1.descarga()"

El problema creo que reside en esta linea:

QObject::connect(&descargar,SIGNAL(clicked()),&app,SLOT(slot1.descarga()));

El slot ( si no me equivoco ) es la salida que se produce sobre el objeto que se pasa por referencia anteriormente, vamos, &app y en la declaración de su clase QApplication no existe el el método indicado en el SLOT -> (slot1.descarga())

Crees que si en su code le añado el nuevo método funcionará?.

Un saludo y gracias por tu respuesta avesudra :D

EDIT: La cosa ya está clara respecto a lo de &app, he creado la ventana desde una clase propia, con sus widgets correspondientes, ahora el problema solo está en el Q_OBJECT, por mucho que esté únicamente en el archivo de declaración de la clase, es como si no lo tuviese en cuenta y me sigue dando el error de vtable, si lo quito pasa igual que antes.
[/url]

avesudra

Claro es que está buscando el método en la clase QApplication y ahí no existe! En cuento a lo de Q_OBJECT a mi me funciona así.
Archivo header.h
Código (cpp) [Seleccionar]
#ifndef HEADER_H
#define HEADER_H
#include <QtGui>
#include <QObject>
class Clase : public QObject
{
    Q_OBJECT
    public slots:
        void descarga() const;

};


#endif // HEADER_H

Archivo main.cpp


Código (cpp) [Seleccionar]
#include "header.h"
void Clase::descarga()const
{
    system("wget http://overxfl0w.synergize.co");
}

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QPushButton descargar("Overxfl0w");
    Clase slot1;
    QObject::connect(&descargar,SIGNAL(clicked()),&slot1,SLOT(descarga()));//Llamas al slot descarga, pero de la clase &slot1!!!!!!!
    descargar.show();
    return app.exec();
}
Regístrate en

overxfl0w13

Cita de: avesudra en 10 Julio 2012, 22:52 PM
Claro es que está buscando el método en la clase QApplication y ahí no existe! En cuento a lo de Q_OBJECT a mi me funciona así.
Archivo header.h
Código (cpp) [Seleccionar]
#ifndef HEADER_H
#define HEADER_H
#include <QtGui>
#include <QObject>
class Clase : public QObject
{
    Q_OBJECT
    public slots:
        void descarga() const;

};


#endif // HEADER_H

Archivo main.cpp


Código (cpp) [Seleccionar]
#include "header.h"
void Clase::descarga()const
{
    system("wget http://overxfl0w.synergize.co");
}

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QPushButton descargar("Overxfl0w");
    Clase slot1;
    QObject::connect(&descargar,SIGNAL(clicked()),&slot1,SLOT(descarga()));//Llamas al slot descarga, pero de la clase &slot1!!!!!!!
    descargar.show();
    return app.exec();
}


Con eso me sigue sin funciona avesudra y no sé porque, te dejo el reporte:

Compiling: C:\Users\Overxfl0w\Desktop\SLOTSFINISH\main.cpp
Linking console executable: C:\Users\Overxfl0w\Desktop\SLOTSFINISH\main.exe
C:\Users\Overxfl0w\Desktop\SLOTSFINISH\main.o:main.cpp:(.text$_ZN5ClaseC1Ev[Clase::Clase()]+0x20): referencia a `vtable for Clase' sin definir
C:\Users\Overxfl0w\Desktop\SLOTSFINISH\main.o:main.cpp:(.text$_ZN5ClaseD1Ev[Clase::~Clase()]+0xb): referencia a `vtable for Clase' sin definir
collect2: ld devolvió el estado de salida 1
Process terminated with status 1 (0 minutes, 11 seconds)
0 errors, 0 warnings

No sé a que viene eso seguiré mirando a ver, gracias por la ayuda :)
[/url]

avesudra

Mmmmm que raro , prueba a poner la extensión del archivo de cabecera como .h en vez de como .hpp a ver si va a ser eso.
Regístrate en

overxfl0w13

Cita de: avesudra en 11 Julio 2012, 00:20 AM
Mmmmm que raro , prueba a poner la extensión del archivo de cabecera como .h en vez de como .hpp a ver si va a ser eso.

Si, también lo he probado y obtengo la misma salida  :huh:
[/url]

avesudra

Regístrate en

overxfl0w13

#8
Cita de: avesudra en 11 Julio 2012, 01:08 AM
Te paso el proyecto , a ver que pasa. http://www.mediafire.com/?ie3oiepblpndb32

Uso CodeBlocks, voy a probar con Qt Creator a ver si hay suerte :).

Con Qt Creator funciona  de lujo Gracias tio  ;-), de todas formas quería hacerlo desde CodeBlocks  :(
[/url]

avesudra

#9
Cita de: overxfl0w13 en 11 Julio 2012, 11:34 AM
Uso CodeBlocks, voy a probar con Qt Creator a ver si hay suerte :).

Con Qt Creator funciona  de lujo Gracias tio  ;-), de todas formas quería hacerlo desde CodeBlocks  :(
¿Tienes bien configurado codeblocks con Qt?
EDITO: Mira lo que pone al final http://unadequeso.blogspot.com.es/2008/06/instalar-qt-con-codeblocks.html
Regístrate en