Здравствуйте уважаемые знатоки. Начинаю учить тонкости Qt (MinGW + Qt 4.5.1 + Eclipse + Qt Integration)
Делаю следующее:
ViewFactory.h
class ViewFactory {
public:
virtual QObject * newInstance() const = 0;
virtual QString getFactoryName() const = 0;
virtual QString getFactoryDesc() const = 0;
};
Q_DECLARE_INTERFACE(ViewFactory,"com.tisadb.ViewFactory\0.1")
class tableviewFactory : public QObject, public ViewFactory
{
Q_OBJECT
Q_INTERFACES(ViewFactory)
public:
QObject * newInstance() const { return const_cast<QObject *>((QObject *)new tableview()); };
QString getFactoryName() const { return QString("TableView"); };
QString getFactoryDesc() const { return QString("TableView version 0.1"); };
};
#define FACTORY_INTERFACE(INTERFACE,INTERFACEDESC) \
class INTERFACE##Factory { \
public: \
virtual QObject * newInstance() const = 0; \
virtual QString getFactoryName() const = 0; \
virtual QString getFactoryDesc() const = 0; \
}; \
Q_DECLARE_INTERFACE(INTERFACE##Factory,INTERFACEDESC)
#define FACTORY(CLASS,INTERFACE,CLASSNAME,CLASSDESC) \
class CLASS##Factory : public QObject, public INTERFACE##Factory { \
Q_OBJECT \
Q_INTERFACES(INTERFACE##Factory) \
public: \
QObject * newInstance() const { return const_cast<QObject *>((QObject *)new CLASS()); }; \
QString getFactoryName() const { return QString(CLASSNAME); }; \
QString getFactoryDesc() const { return QString(CLASSDESC); }; \
};
FACTORY_INTERFACE(View,"com.tisadb.ViewFactory\0.1")
FACTORY(tableview,View,"TableView","TableView verson 0.1")
(.text$_ZN16tableviewFactoryC1Ev[tableviewFactory::tableviewFactory()]+0x2e): undefined reference to `vtable for tableviewFactory'
D:/Devel/tisaprj/tableview/../../qt-win-opensource-src-4.5.1/include/QtCore/../../src/corelib/tools/qlist.h:(.text$_ZN16tableviewFactoryC1Ev[tableviewFactory::tableviewFactory()]+0x3a): undefined reference to `vtable for tableviewFactory'
Это происходит скорее всего из-за того, что moc не распознает класс с Q_OBJECT, который делается с помощью #define FACTORY.
moc парсит исходники до отработки препроцессора и такие подстановки делать не умеет.
И какой может быть выход?
Тем более судя по исходникам эту подстановку делает не moc а препроцессор GCC, а moc - обраватыват только xml-ки и подставляет из вывод в соответствующие файлы
Нет, вижу, действительно может moc виноват, и какой может быть выход?
Дык это я уже понял
class Obj : public QObject
{
Q_OBJECT
Короче решил проблему так:
Factory.h
#define FACTORY_INTERFACE \
virtual QObject * newInstance() const = 0; \
virtual QString getFactoryName() const = 0; \
virtual QString getFactoryDesc() const = 0; \
#define FACTORY(CLASS,CLASSNAME,CLASSDESC) \
public: \
QObject * newInstance() const { return const_cast<QObject *>((QObject *)new CLASS()); }; \
QString getFactoryName() const { return QString(CLASSNAME); }; \
QString getFactoryDesc() const { return QString(CLASSDESC); }; \
private:
ViewFactory.h
class ViewFactory {
public:
FACTORY_INTERFACE
};
Q_DECLARE_INTERFACE(ViewFactory,"com.tisadb.ViewFactory\0.1")
tableview.h
class tableviewFactory : public QObject, public ViewFactory
{
Q_OBJECT
Q_INTERFACES(ViewFactory)
public:
FACTORY(tableview,"TableView", "TableView version 0.1")
};
Конечно не то что хотелось бы, если у кого будут еще сообращения - делитесь
2 Гость_Гость_*, пользуйся тэгом code
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)