Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Q_OBJECT
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
AD
Вопрос такой. При разработке нового класса диалогового окна выдает подобные ошибки, если я использую макрос 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
класс содержащий макрос Q_OBJECT, должен быть в отдельном, от функции main, файле, либо нужно в конце файла приинклюдить MOC'ий заголовочный файл, но я так не пробывал.

Иногда помогает очистить все генерируемые файлы и повторно воспользоваться qmake.
AD
Цитата(Litkevich Yuriy @ 15.4.2008, 17:15) *
класс содержащий макрос Q_OBJECT, должен быть в отдельном, от функции main, файле, либо нужно в конце файла приинклюдить MOC'ий заголовочный файл, но я так не пробывал.

Иногда помогает очистить все генерируемые файлы и повторно воспользоваться qmake.

А какой moc-й заголовочный файл нужен? Пересобрать попытался, не помогло!
Litkevich Yuriy
если все делаешь в одном файле, например main.cpp,
то нужно воткнуть такую строку:
#include "main.moc"

я в стречал ее в конце файла, это у Шлее, и перед функцией main, это у Тролей
Litkevich Yuriy
вот у Макса пример
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
Цитата(Litkevich Yuriy @ 15.4.2008, 18:01) *
если все делаешь в одном файле, например main.cpp,
то нужно воткнуть такую строку:
#include "main.moc"

я в стречал ее в конце файла, это у Шлее, и перед функцией main, это у Тролей

Файлы разные!
Litkevich Yuriy
т.е. макрос в файле main.cpp отсутствует и такую ошибку дает?
AD
Цитата(Litkevich Yuriy @ 15.4.2008, 18:31) *
т.е. макрос в файле main.cpp отсутствует и такую ошибку дает?

в файле main.cpp макроса Q_OBJECT нету! Но есть в файле GraphicDisplay.h
Litkevich Yuriy
попробуй makefile по новой сделать, если ты им пользуешся.
AD
Цитата(Litkevich Yuriy @ 15.4.2008, 18:42) *
попробуй makefile по новой сделать, если ты им пользуешся.

Так я ведь студией компилирую.
ViGOur
1. Использовать макрос Q_OBJECT можно в классах производных от QObject, прямо или косвенно.
2. Объявление и определения класса должно находится в разных файлых, в *.h и *.cpp соответственно.

Посмотри по всем условиям удовлетворяет твой класс?
Если по всем и всеравно такая ошибка, попробуй в студии сделать Clean Solution, а потом снова скомпилить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.