Error aplicacion Qt4

Iniciado por El_Java, 19 Marzo 2011, 18:53 PM

0 Miembros y 1 Visitante están viendo este tema.

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) :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();
}


[Zero]

A mi me compila y me funciona bien quitando el #include "Dialogo.cpp".

Saludos

"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...

[Zero]

¿Usas el QtCreator? Crea un proyecto vacío y añade esos archivos, y pon el mensaje completo que te devuelve el compilador.

Saludos

"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:
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 ===|

[Zero]

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

"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...

[Zero]

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

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

paju1986

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
Hacking, programación, tutoriales, software libre y mucho más en:
http://www.albertinux.com

El_Java

Ok! Gracias paju! :D
Entonces si cambiara QDialog por QObject me vale?