搬家中,,,,请关注 nuihq.com
今天学习QT的时候遇到这样一个问题, 简单来说就是一个需要使用信号和槽机制的子类在继承父类并添加 Q_OBJECT 宏之后报这样的错误: ‘staticMetaObject’ is not a member of ‘Manager’
在网站搜索了这样一篇帖子, 转载来自:http://slopjong.de/2008/10/07/staticmetaobject-is-not-a-member/
I tried to compile a code looking like this:
#ifndef CONTROLLER_H_ #define CONTROLLER_H_ #include class AbstractClass { public: virtual ~AbstractClass() {} virtual void update() = 0; }; class Controller : public AbstractClass, public QObject { Q_OBJECT public: Controller(); virtual ~Controller(); virtual void update(); public slots: void m(); }; #endif /*CONTROLLER_H_*/
If you’re trying to compile it you get an error:
tmp/moc/moc_Controller.cpp:45: error: 'staticMetaObject' is not a member of 'AbstractClass' tmp/moc/moc_Controller.cpp: In member function 'virtual void* Controller::qt_metacast(const char*)': tmp/moc/moc_Controller.cpp:61: error: 'qt_metacast' is not a member of 'AbstractClass' tmp/moc/moc_Controller.cpp: In member function 'virtual int Controller::qt_metacall(QMetaObject::Call, int, void**)': tmp/moc/moc_Controller.cpp:66: error: 'qt_metacall' is not a member of 'AbstractClass' make: *** [tmp/objects/moc_Controller.o] Error 1
The error is caused by a bad order of inheritance.
Instead of this
class Controller : public AbstractClass, public QObject { ...
you should use this
class Controller : public QObject, public AbstractClass { ...
总结一下要自定义信号和槽的话首先你这个类要是一个QObject的子类, 如果需要多继承要将 QObject 放在前面, 同时, 还需要在类声明的开始使用 Q_OBJECT 宏