Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Ошибка компоновки из-за макроса Q_OBJECT (при сабклссинге QwtPlot)

Автор: Rocky 24.9.2010, 14:28

Всем привет! Помогите пожалуйста разобраться с проблемой... Есть класс-наследник от QwtPlot. Добавляю кнопку и делаю ее сыном этого класса-наследника. Далее нужно ловить нажатия на нее. Соединил нужный сигнал со слотом, но ф-я connect возвращает false. Решил что это из-за того, что в начале капсулы моего класса не объявил макрос Q_OBJECT. Как только это делаю, получаю ошибку

Цитата
moc_SpectrViewer.obj : error LNK2001: неразрешенный внешний символ ""public: static struct QMetaObject const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@B)"
F:\CurrentProjects\RTCalculator\Debug\RTCalculator.exe : fatal error LNK1120: 1 неразрешенных внешних элементов


class CSpectrViewer : public QwtPlot
    {
        Q_OBJECT

.....


Сам moc_SpectrViewer.cpp нормально генерируется, включен в проект (исп. VS 2008, qt 4.6.2). Из-за чего возникает ошибка?

Спасибо)

Автор: kwisp 24.9.2010, 16:59

Rocky,
нужны оперделения классав.
какие инклюды пишешь?

возможно у тебя такая же проблема как http://www.prog.org.ru/index.php?topic=8939.msg50234#msg50234

Автор: MoPDoBoPoT 24.9.2010, 17:10

После добавления Q_OBJECT надо чистить проект и делать qmake && make.
Qwt не знаю, поэтому вопрос - QwtPlot является наследником QObject?

Автор: Рокки 24.9.2010, 17:27

Вот взял мастером добавил новый класс.

//buf.h
#ifndef BUF_H
#define BUF_H

#include <qwt_plot.h>

class buf : public QwtPlot
{
    Q_OBJECT

public:
    buf(QWidget *parent);
    ~buf();

private:
    
};

#endif // BUF_H


//buf.cpp
#include "buf.h"

buf::buf(QWidget *parent) : QwtPlot(parent)
{

}

buf::~buf()
{

}

Больше вообще ничего не сделал. Такая же ошибка.. если Q_OBJECT закоментировать - то линкуется... А так - нет. moc_buf.cpp генерируется... QwtPlot объявлен так
class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict
{
    Q_OBJECT
.......  
    explicit QwtPlot(QWidget * = NULL);
    explicit QwtPlot(const QwtText &title, QWidget *p = NULL);
..........
};

Автор: Rocky 24.9.2010, 17:40

Такчто QwtPlot является наследником QObject точно...

kwisp, я нигде не нашел чтоб генерились файлы *.moc.... странно.. но все равно у меня вряд ли то, потому что класс объявлен в отдельном и точно неповторяющемся хидере (

--------
UPD

усе, разобралси =)

помог этот тред
http://www.archivum.info/qt-interest@trolltech.com/2007-08/00380/Re-LNK2001-unresolved-external-symbol-quot-public-static-struct-QMetaObject--const-QwtPlot-staticMetaObject-quot.html

решение - забыл добавить определение препроцессору QWT_DLL =)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)