LINUX.ORG.RU

Ошибки в Qt связаные с Q_OBJECT ... помогите плз!!!


0

0

Вот такая ошибка появляется когда компилисуется программа на Qt

причем если класс описай без директивы Q_OBJECT все компилируется отлично! но стоит только ее добавить ... вот такая ошибка но почему???

[max@localhost gui1]$ make g++ -c -pipe -Wall -W -pipe -Wall -O2 -fexpensive-optimizations -march=i586 -mcpu=i686 -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions -DQT_NO_DEBUG -I/usr/lib/qt3//mkspecs/default -I. -I/usr/lib/qt3//include -I.ui/ -I.moc/ -o .obj/main.o main.cpp g++ -o app .obj/main.o .obj/mainform.o .obj/moc_mainform.o -L/usr/lib/qt3//lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm .obj/main.o: In function `mDraw::mDraw[not-in-charge](QWidget*, char const*)': .obj/main.o(.text+0x32): undefined reference to `vtable for mDraw' .obj/main.o(.text+0x38): undefined reference to `vtable for mDraw' .obj/main.o: In function `mDraw::mDraw[in-charge](QWidget*, char const*)': .obj/main.o(.text+0x82): undefined reference to `vtable for mDraw' .obj/main.o(.text+0x88): undefined reference to `vtable for mDraw' .obj/main.o: In function `mDraw::~mDraw [not-in-charge]()': .obj/main.o(.text+0xb1): undefined reference to `vtable for mDraw' .obj/main.o(.text+0xb8): more undefined references to `vtable for mDraw' follow collect2: ld returned 1 exit status make: *** [app] Ошибка 1 [max@localhost gui1]$

Сам класс выглядит так :

class mDraw : public QWidget { Q_OBJECT public: mDraw(QWidget *parent, const char *name); ~mDraw(); public slots: void DrawOs(); protected: void paintEvent( QPaintEvent * ); private: QPoint *points; };

mDraw::mDraw( QWidget *parent, const char *name ) : QWidget(parent, name) { setBackgroundColor( white ); }

mDraw::~mDraw() { delete[] points; }

void mDraw::paintEvent( QPaintEvent * ) { QPainter paint(this); paint.drawLine(10,10,300,300); }

void mDraw::DrawOs() { QPainter paint(this); paint.drawLine(30,30,300,300); update(); }

а объект от класс создается так :

#include <qapplication.h> #include <qframe.h> #include "mainform.h" #include "mdraw.h"

QFrame *MainFrame; mDraw *MainDraw;

int main( int argc, char ** argv ) { QApplication a( argc, argv ); MainForm w; MainFrame = new QFrame(&w, "MainFrame" ); MainFrame->setGeometry(QRect(4, 7, 466, 451)); MainFrame->setFrameShape(QFrame::Box); MainDraw = new mDraw(&w,"MainDraw"); MainDraw->setGeometry(QRect(5, 8, 464, 449)); a.connect(&w, SIGNAL(osButton_click()), MainDraw, SLOT(MainDraw->DrawOs())); w.show(); a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); return a.exec(); }

anonymous

Блин! Учите матчасть! Q_OBJECT - макрос, который должен обрабатываться компилятором мета-объектов. Если в классе есть макрос Q_OBJECT, то данный модуль нужно пропускать через moc. В итоге должен появиться еще один файл, который и определяет те символы, ссылки на которые твой линковщик не нашел.

Итого, что тебе нужно сделать: 1) Решить - как ты будешь компилировать код, который сгенериит moc - отдельным модулем или инклудить в основной модуль. 2) Написать соответствующий Makefile

Если хочешь компилить метаобъекты отдельным модулем - тогда определение класса нужно пихать в хидер и обрабатывать его moc-ом, а результат - компилить g++ как отдельный модуль и линковать вместе с остальными

Возможен другой вариант: определить класс в cpp-модуле и в конце файла сделать дописочку: #include "main.moc" , после чего прогнать cpp-модуль через moc с помощью команды:

moc main.cpp >main.moc

Дальше - все как обычно...

anonymous
()

qt- дизайнер сам пропускает этот класс через moc компилятор. В результате получается файл moc_mdraw.cpp и линкер собирает все файлы вместе, но ошибка остаётся. В чем проблема? Как это исправить?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.