Seite 1 von 1

Q_OBJECT lässt sich nicht kompilieren

Verfasst: 10. Dezember 2008 15:50
von IceCook
hi,

Mein ursprüngliches Problem war, dass connect nicht auf einen SLOT in der eigenen Klasse zugreifen konnte. Darum habe ich laut Doku ein Q_OBJECT in den "private" Bereich der Klasse eingefügt (die Methoden werden ausserhalb definiert, jedoch im gleichen file). Damit das Makro Q_OBJECT "angenommen" wird, muss die Klasse von QObject erben. Meine Klasse erbt von QWidget, das wiederum von QObject erbt. Also sind die Bedingungen doch erfüllt?

Mein Code:

Code: Alles auswählen

class MyWidget : public QWidget
{
	Q_OBJECT
public:
	MyWidget(QWidget* parent=0);

public slots:
	void find();
};

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
        QPushButton *findButton = new QPushButton;

        [...]
	findButton->setText(tr("&Solve"));
	findButton->setFont(QFont("Times", 18, QFont::Bold));

	bool ok = connect(findButton,SIGNAL(clicked()), this , SLOT(find()));

	if (!ok)
		Out->setText(QString("fail"));  //eigene Klasse


       //Layouts
	QGridLayout * gridLayout = new QGridLayout;
       //[...]
	setLayout(mainLayout);
}

void MyWidget::find()
{
 // code
}




int main (int argc , char * argv[])
{
    QApplication App(argc, argv);
    MyWidget widget;
	widget.setGeometry(300,400,300,400);
	widget.show();
	return App.exec();
}
Was habe ich falsch verstanden?

Verfasst: 10. Dezember 2008 16:02
von jerry42
Hallo,

was tut denn nun nicht? Was spuckt der Compiler aus? Was ist der Fehler?
Poste doch den mal, dann weiß man auch wo man ansetzen kann.

Gruß jerry42

Verfasst: 10. Dezember 2008 16:07
von VuuRWerK
Ausserdem gibt es in Deiner Klasse keinen Prototypen für MyWidget::find, vielleicht ist ja das Dein Problem aber wie schon gesagt wurde wissen wir es nicht und Du sagst dies bezüglich auch nichts und unsere Glaskugeln streiken heute mal wieder ...

Gut Schuß
VuuRWerK ;)

Verfasst: 10. Dezember 2008 16:35
von IceCook
sry, ich habe die Compiler infos vergessen..
Doch es existiert ein Prototyp von find (habe nur das falsche heraus gelöscht).
Compiler:

Code: Alles auswählen

make all 
g++ -c -pipe -g -DQTTEST_DEBUG -D_REENTRANT -Wall -W -DMYFLAGS -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include -I. -I/usr/X11R6/include -I. -I. -o main.o main.cpp
main.cpp: In constructor »MyWidget::MyWidget(QWidget*)«:
g++ -Wl,-rpath,/usr/lib -o bin/arbeit main.o alk.o moc_Input.o    -Lbin -L/usr/X11R6/lib -L/usr/lib -Lbin -lGLU -lGL -lQtGui -L/usr/lib -L/usr/X11R6/lib -pthread -lpng -lSM -lICE -pthread -pthread -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -lpthread -ldl
main.o: In function `MyWidget':
/home/beni/workspace/arbeit/main.cpp:65: undefined reference to `vtable for MyWidget'
/home/beni/workspace/arbeit/main.cpp:65: undefined reference to `vtable for MyWidget'
/home/beni/workspace/arbeit/main.cpp:65: undefined reference to `vtable for MyWidget'
/home/beni/workspace/arbeit/main.cpp:65: undefined reference to `vtable for MyWidget'
main.o: In function `~MyWidget':
/home/beni/workspace/arbeit/main.cpp:50: undefined reference to `vtable for MyWidget'
main.o:/home/beni/workspace/arbeit/main.cpp:50: more undefined references to `vtable for MyWidget' follow
main.o: In function `MyWidget::tr(char const*, char const*)':
/home/beni/workspace/arbeit/main.cpp:51: undefined reference to `MyWidget::staticMetaObject'
collect2: ld gab 1 als Ende-Status zurück
make: *** [bin/arbeit] Fehler 1
Dies Zeilennummern stimmen leider nicht überein. Aber das sollte doch schon gehen. Ich habe den Prototyp im ersten Post angepasst.

Verfasst: 10. Dezember 2008 16:49
von jerry42
Nach einer kurzen Forensuche (wo auch du schnell fündig geworden wärst) liegt folgendes Problem vor.

Der moc verarbeitet dein Q_OBJECT nicht, da er nur Header durchsucht.
Allerdings hast du Header und Source in einer File zusammen, und diese ist die main.cpp.

Also mein Vorschlag wäre, dass du für deine KLasse eine source Datei und eine header Datei erstellst, und dann die header Datei in main.cpp inkludierst.

Das sollte eigentlich das Problem dann lösen.

Gruß jerry42

Verfasst: 10. Dezember 2008 17:04
von IceCook
Ich habe diesen Forumsbeitrag gefunden und es auch ausprobiert (es steht auch in de Qt docs). Aber ich hatte vergessen die Headerdatei in die *.pro Datei einzutragen => Fehlermeldung. Danke für die Hilfe.