Autor
|
Tema: Error aplicacion Qt4 (Leído 5,402 veces)
|
El_Java
|
Hola, estoy aprendiendo a usar la libreria Qt, y estoy haciendo por mi mismo un ejemplo que aparece en un tutorial pdf que estoy siguiendo, pero cuando intento ejecutarlo me da multiples errores como estos: - multiple definition of `Dialogo::Dialogo(QWidget*)' (y ~Dialogo)
- undefined reference to `vtable for Dialogo' (y ~Dialogo)
Otros programas en Qt no me han dado ningun tipo de problema, aqui os pongo el codigo( SI, es un tochazo, pero espero que hagais un esfuerzo en ayudarme) dialogo.h #ifndef DIALOGO_H #define DIALOGO_H
#include <QDialog>
class QCheckBox; class QLabel; class QLineEdit; class QPushButton;
class Dialogo : public QDialog{ Q_OBJECT //Siempre necesario para declarar SIGNALS AND SLOTS
public: Dialogo(QWidget *parent = 0); ~Dialogo();
signals: void findNext(const QString &str, Qt::CaseSensitivity cs); void findPrevious(const QString &str, Qt::CaseSensitivity cs);
private slots: void findClicked(); void enableFindButton(const QString &text);
private: QLabel *label; QLineEdit *lineEdit; QCheckBox *caseCheckBox; QCheckBox *backwardCheckBox; QPushButton *findButton; QPushButton *closeButton; };
#endif // DIALOGO_H
Dialogo.cpp #include <QtGui> #include "dialogo.h"
Dialogo::Dialogo(QWidget *parent) : QDialog(parent){ label = new QLabel(tr("Find &what:")); lineEdit = new QLineEdit; label->setBuddy(lineEdit);
caseCheckBox = new QCheckBox(tr("Match &case")); backwardCheckBox = new QCheckBox(tr("Search &backward"));
findButton = new QPushButton(tr("&Find")); findButton->setDefault(true); findButton->setEnabled(false);
closeButton = new QPushButton(tr("Close"));
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(const QString &))); connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked())); connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
QHBoxLayout *topLeftLayout = new QHBoxLayout; topLeftLayout->addWidget(label); topLeftLayout->addWidget(lineEdit);
QVBoxLayout *leftLayout = new QVBoxLayout; leftLayout->addLayout(topLeftLayout); leftLayout->addWidget(caseCheckBox); leftLayout->addWidget(backwardCheckBox);
QVBoxLayout *rightLayout = new QVBoxLayout; rightLayout->addWidget(findButton); rightLayout->addWidget(closeButton); rightLayout->addStretch();
QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addLayout(leftLayout); mainLayout->addLayout(rightLayout); setLayout(mainLayout);
setWindowTitle(tr("Find")); setFixedHeight(sizeHint().height()); }
Dialogo::~Dialogo(){ delete this; }
void Dialogo::findClicked(){ QString text = lineEdit->text(); Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive; if (backwardCheckBox->isChecked()){ emit findPrevious(text,cs); } else { emit findNext(text, cs); } }
void Dialogo::enableFindButton(const QString &text){ findButton->setEnabled(!text.isEmpty()); }
main.cpp #include <QApplication>
#include "dialogo.h" #include "dialogo.cpp" /*Este paso no aparece en el ejemplo del tutorial, pero crei que solucionaria el error */
int main(int argc, char *argv[]){ QApplication app(argc, argv); Dialogo *dialogo = new Dialogo; dialogo->show(); return app.exec(); }
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
A mi me compila y me funciona bien quitando el #include "Dialogo.cpp".
Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
El_Java
|
Gracias por la info, yo quitando el #include "dialogo.cpp" me aparece el segundo error todavia :S debe de ser algo que hice mal al agregar la libreria de qt, pero ya te digo que con otras aplicaciones si me funciona...
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
¿Usas el QtCreator? Crea un proyecto vacío y añade esos archivos, y pon el mensaje completo que te devuelve el compilador.
Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
El_Java
|
No, estoy usando el Code::blocks, prefiero hacerlo asi, ya cuando entienda todo perfecto me pasaré a lo "facil". Aqui está el error que me da: ||=== Temporal, Debug ===| obj/Debug/dialogo.o||In function `Dialogo':| /home/java/Workspace code::blocks/Temporal/dialogo.cpp|4|undefined reference to `vtable for Dialogo'| /home/java/Workspace code::blocks/Temporal/dialogo.cpp|4|undefined reference to `vtable for Dialogo'| /home/java/Workspace code::blocks/Temporal/dialogo.cpp|4|undefined reference to `vtable for Dialogo'| /home/java/Workspace code::blocks/Temporal/dialogo.cpp|4|undefined reference to `vtable for Dialogo'| obj/Debug/dialogo.o||In function `~Dialogo':| /home/java/Workspace code::blocks/Temporal/dialogo.cpp|48|undefined reference to `vtable for Dialogo'| obj/Debug/dialogo.o:/home/java/Workspace code::blocks/Temporal/dialogo.cpp|48|more undefined references to `vtable for Dialogo' follow| obj/Debug/dialogo.o||In function `Dialogo::findClicked()':| /home/java/Workspace code::blocks/Temporal/dialogo.cpp|58|undefined reference to `Dialogo::findPrevious(QString const&, Qt::CaseSensitivity)'| /home/java/Workspace code::blocks/Temporal/dialogo.cpp|61|undefined reference to `Dialogo::findNext(QString const&, Qt::CaseSensitivity)'| obj/Debug/dialogo.o||In function `Dialogo::tr(char const*, char const*)':| /home/java/Workspace code::blocks/Temporal/dialogo.h|12|undefined reference to `Dialogo::staticMetaObject'| ||=== Build finished: 9 errors, 0 warnings ===|
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
Buf, pos debe de ser alguna mala configuración o que conmpilaste mal Qt, porque te da un error en un *.o, no en el propio código... Intenta volver a compilarlo bien, o sinó QtCreator.
Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
El_Java
|
Puf, no sabes lo muchísimo que me costo conseguir que funcionase la libreria Qt Tu que es lo que usas? por si me pudiese servir de ejemplo o algo...
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
Puf, no sabes lo muchísimo que me costo conseguir que funcionase la libreria Qt Tu que es lo que usas? por si me pudiese servir de ejemplo o algo... Yo uso QtCreator, es un gra IDE, y con el Designer y demás herramientas de Qt integradas completamente. Además, lo instalas y lo usas, ya no es necesario compilar las librerías. Antes usaba Visual Studio, pero como tuve ciertos problemas (tenía que recompilar las librerías para cambiar alguna cosa en la configuración) me pasé a QtCreator, ha ido mejorando mucho, es muy bueno. Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
paju1986
Desconectado
Mensajes: 117
http://www.albertinux.com
|
ese error es debido a que heredas de una clase que tiene funciones virtuales, tendrias que reimplementar todas las funciones virtuales en la clase hija, por eso en qt se hereda siempre de QObject o de QWidget, pero heredar de QDialog no es una muy buena idea...
SALUDOS
|
|
|
En línea
|
|
|
|
El_Java
|
Ok! Gracias paju! Entonces si cambiara QDialog por QObject me vale?
|
|
|
En línea
|
|
|
|
|
|