Der Wald und die Bäume

Alles rund um die Programmierung mit Qt
Antworten
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Der Wald und die Bäume

Beitrag von QtBerserker »

Hi,

irgendwie sehe ich wohl den Wald vor Bäumen nicht:

Code: Alles auswählen

#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtDebug>

class Application
    : public QApplication
{
    Q_OBJECT

public:
    Application(int argc,  char **argv);
    virtual ~Application();

};

Application::Application(int argc,  char **argv)
    : QApplication(argc, argv)
{
    qDebug() << "CTor App";
}

Application::~Application()
{
    qDebug() << "DTor App";
}

int main(int argc,  char **argv)
{
    Application app( argc, argv );

    QMainWindow win;
    win.show();

    return app.exec();
}
mit

Code: Alles auswählen

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .
SOURCES += app.cpp
und der Compiler meint:

Code: Alles auswählen

g++ -c -pipe -O2 -Wall -W -D_REENTRANT  -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o app.o app.cpp
g++  -o qtest app.o    -L/usr/lib -lQtGui -lQtCore -lpthread
app.o: In function `Application::Application(int, char**)':
app.cpp:(.text+0x30): undefined reference to `vtable for Application'
app.o: In function `Application::Application(int, char**)':
app.cpp:(.text+0x310): undefined reference to `vtable for Application'
app.o: In function `main':
app.cpp:(.text+0x637): undefined reference to `vtable for Application'
app.cpp:(.text+0x65d): undefined reference to `vtable for Application'
collect2: ld gab 1 als Ende-Status zurück
make: *** [qtest] Fehler 1
Wer reisst mir das Brett vor dem Kopf weg?

Vielen Dank
Olaf
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Q_OBJECT in cpp geht nicht
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

Christian81 hat geschrieben:Q_OBJECT in cpp geht nicht
Hilf mir mal, ich kann damit nichts anfangen. Es scheint also zumindest am Qt Macro zu hängen.

Olaf
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Eine Klassendefintion muss in einen Header und nicht in ein Source-File. Erstens weil ein Header dafür da ist und zweitens weil nur dort qmake was mit Q_OBJECT anfangen kann.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

das zweite war's, Danke!

Hintergrund des Experimentierens war:

Code: Alles auswählen

#ifndef APP_H
#define APP_H

#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtDebug>

#include <cstring>
#include <memory>

class Application
    : public QApplication
{
    Q_OBJECT

public:
    Application(int argc,  char **argv);
    virtual ~Application();
public:
    bool operator()() const { return m_runApp; }

private:
    void buildApp();

private:
    bool m_runApp;
    std::auto_ptr<QMainWindow> m_win;
};

#endif // APP_H
und

Code: Alles auswählen

#include <app.h>

Application::Application(int argc,  char **argv)
    : QApplication(argc, argv),
      m_runApp( true )
{
    qDebug() << "CTor App";

    for ( int i = 0; i != argc; ++i ) {
        if (std::strcmp( argv[i], "-help") == 0) {
            qDebug() << "Usage: " << argv[0] << " [-help]";
            m_runApp = false;
            return;
        }
    }

    buildApp();
}

Application::~Application()
{
    qDebug() << "DTor App";
}

void Application::buildApp()
{
    m_win.reset( new QMainWindow );
    m_win->show();
}

int main(int argc,  char **argv)
{
    try {
        Application app( argc, argv );

        if ( app() )  return app.exec();
        else          return 0;
    }
    catch(const std::exception &e ) {
        qDebug() << "Caught Exception " << e.what();
    }
    catch( ... ) {
        qDebug() << "Caught unexpected Exception.";
    }

    return -1;
}
Hinweise zu diesem Prinzip?

Grüße
Olaf
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was gibts da für Probleme ausser dass ich

Code: Alles auswählen

  try {
        Application app( argc, argv );

        if ( app() )  return app.exec();
        else          return 0;
    }
    catch(const std::exception &e ) {
        qDebug() << "Caught Exception " << e.what();
    }
doch etwas übertrieben finde.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten