Версия для печати темы
Форум на CrossPlatform.RU _ Qt Общие вопросы _ Q_OBJECT
Автор: AD 15.4.2008, 16:09
Вопрос такой. При разработке нового класса диалогового окна выдает подобные ошибки, если я использую макрос Q_OBJECT:
1>LINK : ..\..\Bin\Debug\TransasLogViewer\TLV.exe not found or not built by the last incremental link; performing full link
1>GraphicDisplay.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall GraphicDisplay::metaObject(void)const " (?metaObject@GraphicDisplay@@UBEPBUQMetaObject@@XZ)
1>GraphicDisplay.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall GraphicDisplay::qt_metacast(char const *)" (?qt_metacast@GraphicDisplay@@UAEPAXPBD@Z)
1>GraphicDisplay.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall GraphicDisplay::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@GraphicDisplay@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>..\..\Bin\Debug\TransasLogViewer\TLV.exe : fatal error LNK1120: 3 unresolved externals
1>Build log was saved at "file://d:\Projects\Win32\Obj\Debug\TransasLogViewer\BuildLog.htm"
1>TLV - 4 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Автор: Litkevich Yuriy 15.4.2008, 16:15
класс содержащий макрос Q_OBJECT, должен быть в отдельном, от функции main, файле, либо нужно в конце файла приинклюдить MOC'ий заголовочный файл, но я так не пробывал.
Иногда помогает очистить все генерируемые файлы и повторно воспользоваться qmake.
Автор: AD 15.4.2008, 16:45
Цитата(Litkevich Yuriy @ 15.4.2008, 17:15)
класс содержащий макрос Q_OBJECT, должен быть в отдельном, от функции main, файле, либо нужно в конце файла приинклюдить MOC'ий заголовочный файл, но я так не пробывал.
Иногда помогает очистить все генерируемые файлы и повторно воспользоваться qmake.
А какой moc-й заголовочный файл нужен? Пересобрать попытался, не помогло!
Автор: Litkevich Yuriy 15.4.2008, 17:01
если все делаешь в одном файле, например main.cpp,
то нужно воткнуть такую строку:
#include "main.moc"
я в стречал ее в конце файла, это у Шлее, и перед функцией
main, это у Тролей
Автор: Litkevich Yuriy 15.4.2008, 17:07
вот у Макса пример
CODE
/* ======================================================================
** main.cpp
** ======================================================================
**
** ======================================================================
** Copyright © 2007 by Max Schlee
** ======================================================================
*/
#include <QtGui>
// ======================================================================
class MyThread : public QThread {
Q_OBJECT
private:
int m_nValue;
public:
MyThread() : m_nValue(10)
{
}
void run()
{
QTimer timer;
connect(&timer, SIGNAL(timeout()), SLOT(slotNextValue()));
timer.start(1000);
exec();
}
signals:
void finished ( );
void currentValue(int);
public slots:
void slotNextValue()
{
emit currentValue(--m_nValue);
if (!m_nValue) {
emit finished();
}
}
};
// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QLCDNumber lcd;
MyThread thread;
QObject::connect(&thread, SIGNAL(currentValue(int)),
&lcd, SLOT(display(int))
);
QObject::connect(&thread, SIGNAL(finished()),
&app, SLOT(quit())
);
lcd.setSegmentStyle(QLCDNumber::Filled);
lcd.display(10);
lcd.resize(220, 90);
lcd.show();
thread.start();
return app.exec();
}
#include "main.moc"
Файл проекта, без особенностей:
TEMPLATE = app
SOURCES = main.cpp
win32:TARGET = ../ThreadTimer
Автор: AD 15.4.2008, 17:16
Цитата(Litkevich Yuriy @ 15.4.2008, 18:01)
если все делаешь в одном файле, например
main.cpp,
то нужно воткнуть такую строку:
#include "main.moc"
я в стречал ее в конце файла, это у Шлее, и перед функцией
main, это у Тролей
Файлы разные!
Автор: Litkevich Yuriy 15.4.2008, 17:31
т.е. макрос в файле main.cpp отсутствует и такую ошибку дает?
Автор: AD 15.4.2008, 17:37
Цитата(Litkevich Yuriy @ 15.4.2008, 18:31)
т.е. макрос в файле main.cpp отсутствует и такую ошибку дает?
в файле
main.cpp макроса Q_OBJECT нету! Но есть в файле GraphicDisplay.h
Автор: Litkevich Yuriy 15.4.2008, 17:42
попробуй makefile по новой сделать, если ты им пользуешся.
Автор: AD 15.4.2008, 17:47
Цитата(Litkevich Yuriy @ 15.4.2008, 18:42)
попробуй makefile по новой сделать, если ты им пользуешся.
Так я ведь студией компилирую.
Автор: ViGOur 16.4.2008, 7:54
1. Использовать макрос Q_OBJECT можно в классах производных от QObject, прямо или косвенно.
2. Объявление и определения класса должно находится в разных файлых, в *.h и *.cpp соответственно.
Посмотри по всем условиям удовлетворяет твой класс?
Если по всем и всеравно такая ошибка, попробуй в студии сделать Clean Solution, а потом снова скомпилить.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)