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) :P
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();
}
A mi me compila y me funciona bien quitando el #include "Dialogo.cpp".
Saludos
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...
¿Usas el QtCreator? Crea un proyecto vacío y añade esos archivos, y pon el mensaje completo que te devuelve el compilador.
Saludos
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:
Citar
||=== 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 ===|
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
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...
Cita de: El_Java en 19 Marzo 2011, 23:01 PM
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
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
Ok! Gracias paju! :D
Entonces si cambiara QDialog por QObject me vale?
No se exactamente que hace tu programa pero si haces eso seguramente tendrás que cambiar más cosas.
UN SALUDO