Q_OBJECT lässt sich nicht kompilieren

Alles rund um die Programmierung mit Qt
Antworten
IceCook
Beiträge: 6
Registriert: 22. November 2008 18:06

Q_OBJECT lässt sich nicht kompilieren

Beitrag 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?
Zuletzt geändert von IceCook am 10. Dezember 2008 16:35, insgesamt 1-mal geändert.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag 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 ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
IceCook
Beiträge: 6
Registriert: 22. November 2008 18:06

Beitrag 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.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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
IceCook
Beiträge: 6
Registriert: 22. November 2008 18:06

Beitrag 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.
Antworten