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.
#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 :)
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!
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:
class Clase : public QObject
{
public slots:
void descarga() const;
};
Y el .cpp principal que podría ser este:
#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.
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
#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
#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();
}
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
#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
#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 :)
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.
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:
Te paso el proyecto , a ver que pasa. http://www.mediafire.com/?ie3oiepblpndb32
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 :(
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
Cita de: avesudra en 11 Julio 2012, 13:22 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 :)
¡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!
;) over no me líes más con las herencias xD
calla cabron y metete al skype jaja
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!
¡Buen aporte! Le servirá a mucha gente XeRaCKeR, ¡gracias por avisar! ;-)