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

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

Форум на CrossPlatform.RU _ Qt Общие вопросы _ наследование с Q_OBJECT

Автор: quarz 17.12.2009, 0:14

Свой класс наследую от класса без Q_OBJECT.
В своем классе определяю Q_OBJECT и пытаюсь вещать сигналы. Получаю следующие ошибки:

Раскрывающийся текст

1>Compiling...
1>graphscaledraw.cpp
1>Compiling...
1>moc_graphscaledraw.cpp
1>.\GeneratedFiles\debug - usermode\moc_graphscaledraw.cpp(42) : error C2039: 'staticMetaObject' : is not a member of 'QwtScaleDraw'
1> C:\qwt-5.2.0\src\qwt_scale_draw.h(30) : see declaration of 'QwtScaleDraw'
1>.\GeneratedFiles\debug - usermode\moc_graphscaledraw.cpp(56) : error C2039: 'qt_metacast' : is not a member of 'QwtScaleDraw'
1> C:\qwt-5.2.0\src\qwt_scale_draw.h(30) : see declaration of 'QwtScaleDraw'
1>.\GeneratedFiles\debug - usermode\moc_graphscaledraw.cpp(61) : error C2039: 'qt_metacall' : is not a member of 'QwtScaleDraw'
1> C:\qwt-5.2.0\src\qwt_scale_draw.h(30) : see declaration of 'QwtScaleDraw'
1>.\GeneratedFiles\debug - usermode\moc_graphscaledraw.cpp(77) : error C2665: 'QMetaObject::activate' : none of the 4 overloads could convert all the argument types
1> c:\qt\4.5.0\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(334): could be 'void QMetaObject::activate(QObject *,int,int,void **)'
1> c:\qt\4.5.0\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(335): or 'void QMetaObject::activate(QObject *,const QMetaObject *,int,void **)'
1> while trying to match the argument list '(DivScaleDraw *const , const QMetaObject *, int, int)'
1>Build log was saved at "file://d:\Исходники\Работа\XIDC\XILab\debug - usermode\BuildLog.htm"
1>XILab - 4 error(s), 0 warning(s)


Вот код:
class DivScaleDraw: public QwtScaleDraw
{
    Q_OBJECT
public:
        .....
signals:
    void firstScaleChanged();
}.


Как я понял компилятор возмущается что в классе-родителе (QwtScaleDraw) нет Q_OBJECT и следовательно в нем нет 'staticMetaObject', 'qt_metacast', и т.д. Если все так, проблема имеет решение?

Автор: BRE 17.12.2009, 7:44

Так а где наследование от QObject?
Просто вписать Q_OBJECT не достаточно.

Автор: Litkevich Yuriy 17.12.2009, 10:05

Цитата(quarz @ 17.12.2009, 3:14) *
QwtScaleDraw
наследник QwtAbstractScaleDraw.
А QwtAbstractScaleDraw - это самостоятельный класс, у него нет базового класса

Автор: sploid 17.12.2009, 11:46

надо так:

class DivScaleDraw: public QObject, public QwtScaleDraw

Автор: quarz 17.12.2009, 14:32

Верно, спасибо большое! Ночью соображалка не сработала (( Только потом дошло что надо наследоваться сначала от QObject, а то при попытке

class DivScaleDraw: public QwtScaleDraw, public QObject

ессно возникала ошибка.

Автор: Litkevich Yuriy 17.12.2009, 17:17

как же новички любят далеко лазить за тэгом CODEBOX, когда кнопка code ближе

Автор: quarz 28.12.2009, 18:25

Цитата(Litkevich Yuriy @ 17.12.2009, 17:17) *
как же новички любят далеко лазить за тэгом CODEBOX, когда кнопка code ближе


Еще бы, когда кнопка CODEBOX намного более заметная ;)

Автор: Litkevich Yuriy 28.12.2009, 18:30

Цитата(quarz @ 28.12.2009, 21:25) *
кнопка CODEBOX
такой кнопки вообще нет

Вот кнопка "Код" -

А за codebox, нужно лезть в список "спец. элементы", который доступен только в форме полного ответа.
В форме быстрого ответа этот список отсутствует, а вот кнопка "код" есть.

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