Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: overxfl0w13 en 10 Julio 2012, 13:20 pm



Título: Slots QT
Publicado por: overxfl0w13 en 10 Julio 2012, 13:20 pm
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
  1. #include <QtGui>
  2. #include <QObject>
  3.  
  4. class Clase : public QObject
  5. {
  6.    Q_OBJECT
  7.  
  8.    public slots:
  9.        void descarga() const;
  10.  
  11. };
  12.  
  13. void Clase::descarga() const
  14. {
  15.    system("wget http://overxfl0w.synergize.co");
  16. }
  17.  
  18. int main(int argc,char *argv[])
  19. {
  20.    QApplication app(argc,argv);
  21.    QPushButton descargar("Overxfl0w");
  22.    Clase slot1;
  23.    QObject::connect(&descargar,SIGNAL(clicked()),&app,SLOT(slot1.descarga()));
  24.    descargar.show();
  25. }
  26.  
  27.  

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

Gracias  :)


Título: Re: Slots QT
Publicado por: 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!


Título: Re: Slots QT
Publicado por: overxfl0w13 en 10 Julio 2012, 21:57 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
  1. class Clase : public QObject
  2. {
  3.  
  4.    public slots:
  5.        void descarga() const;
  6.  
  7. };
  8.  

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

Código
  1. #include <QtGui>
  2. #include <QObject>
  3. #include "slots.hpp"
  4.  
  5. void Clase::descarga() const
  6. {
  7.    system("wget http://overxfl0w.synergize.co");
  8. }
  9.  
  10. int main(int argc,char *argv[])
  11. {
  12.    QApplication app(argc,argv);
  13.    QPushButton descargar("Overxfl0w");
  14.    Clase slot1;
  15.    QObject::connect(&descargar,SIGNAL(clicked()),&app,SLOT(slot1.descarga()));
  16.    descargar.show();
  17.    return app.exec();
  18. }
  19.  

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.


Título: Re: Slots QT
Publicado por: 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
  1. #ifndef HEADER_H
  2. #define HEADER_H
  3. #include <QtGui>
  4. #include <QObject>
  5. class Clase : public QObject
  6. {
  7.    Q_OBJECT
  8.    public slots:
  9.        void descarga() const;
  10.  
  11. };
  12.  
  13.  
  14. #endif // HEADER_H
  15.  
Archivo main.cpp


Código
  1. #include "header.h"
  2. void Clase::descarga()const
  3. {
  4.    system("wget http://overxfl0w.synergize.co");
  5. }
  6.  
  7. int main(int argc,char *argv[])
  8. {
  9.    QApplication app(argc,argv);
  10.    QPushButton descargar("Overxfl0w");
  11.    Clase slot1;
  12.    QObject::connect(&descargar,SIGNAL(clicked()),&slot1,SLOT(descarga()));//Llamas al slot descarga, pero de la clase &slot1!!!!!!!
  13.    descargar.show();
  14.    return app.exec();
  15. }
  16.  


Título: Re: Slots QT
Publicado por: overxfl0w13 en 10 Julio 2012, 23:40 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
  1. #ifndef HEADER_H
  2. #define HEADER_H
  3. #include <QtGui>
  4. #include <QObject>
  5. class Clase : public QObject
  6. {
  7.    Q_OBJECT
  8.    public slots:
  9.        void descarga() const;
  10.  
  11. };
  12.  
  13.  
  14. #endif // HEADER_H
  15.  
Archivo main.cpp


Código
  1. #include "header.h"
  2. void Clase::descarga()const
  3. {
  4.    system("wget http://overxfl0w.synergize.co");
  5. }
  6.  
  7. int main(int argc,char *argv[])
  8. {
  9.    QApplication app(argc,argv);
  10.    QPushButton descargar("Overxfl0w");
  11.    Clase slot1;
  12.    QObject::connect(&descargar,SIGNAL(clicked()),&slot1,SLOT(descarga()));//Llamas al slot descarga, pero de la clase &slot1!!!!!!!
  13.    descargar.show();
  14.    return app.exec();
  15. }
  16.  

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 :)


Título: Re: Slots QT
Publicado por: 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.


Título: Re: Slots QT
Publicado por: overxfl0w13 en 11 Julio 2012, 00:51 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:


Título: Re: Slots QT
Publicado por: avesudra en 11 Julio 2012, 01:08 am
Te paso el proyecto , a ver que pasa. http://www.mediafire.com/?ie3oiepblpndb32


Título: Re: Slots QT
Publicado por: overxfl0w13 en 11 Julio 2012, 11:34 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  :(


Título: Re: Slots QT
Publicado por: avesudra en 11 Julio 2012, 13:22 pm
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


Título: Re: Slots QT
Publicado por: overxfl0w13 en 11 Julio 2012, 14:07 pm
¿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

Aaaah ahí estaba la cosa, seguí ese tutorial y se me pasó la parte última jaja gracias tio  ;-).

En unos días subiré un chat que estoy haciendo con los sockets de qt me gustaría que lo probarás es en parte tuyo por la ayuda ;)

Un saludo tio :)


Título: Re: Slots QT
Publicado por: avesudra en 11 Julio 2012, 14:16 pm
¡Anda ya como va a ser mío , el trabajo del code es tuyo! Claro que te lo pruebo ¡y con mucho gusto!

¡Un saludo!


Título: Re: Slots QT
Publicado por: anonimo12121 en 11 Julio 2012, 17:02 pm
;) over no me líes más con las herencias xD


Título: Re: Slots QT
Publicado por: overxfl0w13 en 12 Julio 2012, 15:29 pm
calla cabron y metete al skype jaja


Título: Re: Slots QT
Publicado por: X3R4CK3R en 14 Julio 2012, 23:31 pm
Pff, llevo el día de hoy entero buscando solución a esto y por fin la he hayado... ahí va:

El problema reside en que necesitas un archivo "moc" por cada header relacionado con Q_OBJECT que tengas en tu proyecto. Si tu proyecto consta de los siguientes archivos: main.cpp, chat.cpp, y chat.hpp, necesitas generar un moc_chat.cpp. De esto se encarga el ejecutable moc.exe, que podrás encontrar en la carpeta bin (en la carpeta de instalación de Qt). En fin, cómo hacer esto en Code::Blocks?

Pues vamos a Tools/Configure Tools.../Add y rellenamos:
Citar
Name: MOC
Executable: Path/to/moc.exe (En mi caso: C:\QtSDK\Desktop\Qt\4.8.1\mingw\bin\moc.exe)
Parameters: ${ACTIVE_EDITOR_FILENAME} -o  moc_${ACTIVE_EDITOR_STEM}.cpp
Working Directory: ${PROJECT_DIR}

Y esto nos generará el archivo que necesitamos, basta con tener abierto el header y ejecutar la tool. Acto seguido, incluimos éste nuevo archivo al proyecto de Code::Blocks y compilamos, y si todo ha ido bien, deberían desaperecer esos horribles y tenebrosos "Undefined reference to 'vtable'" que tanto me han perturbado estos últimos días xD

Espero les sirva

EDIT: Es necesario crear un proyecto de Qt4 (No funciona con Empty file)

Fuente: http://forums.codeblocks.org/index.php?topic=13420.0

Saludos!


Título: Re: Slots QT
Publicado por: avesudra en 15 Julio 2012, 01:32 am
¡Buen aporte! Le servirá a mucha gente XeRaCKeR, ¡gracias por avisar! ;-)