i have a class that inherits from QObject and have the Q_OBJECT macro:
class SomeClass: public QObject
{
Q_OBJECT
public:
SomeClass(QObject *parent = 0);
void method1();
void method2();
...
};
in another class in the same header i create an instance of that class, and then i try to get all Methods from 'SomeClass' and store it in a QMap:
this->someclass = new SomeClass(); // in constructor.
...
cout<<"init some class methods"<<endl;
const QMetaObject *metaobj = dynamic_cast<QObject*>(this->someclass)->metaObject();
cout<<"offset "<<metaobj->methodOffset()<<endl;
for(int i = metaobj->methodOffset();i < metaobj->methodCount();i++){
QMetaMethod metamethod = metaobj->method(i);
//if(metamethod.methodType() == QMetaMethod::Method){
QString methodname = QString(metamethod.signature());
methodname = methodname.replace(QRegExp("\\(.*\\)"),"");
controlmethods.insert(methodname,metamethod);
cout<<"added method: "<<metamethod.signature()<<" as "<<methodname.toAscii().data()<<endl;
//}
}
But this do not showed me any method added because the methods offset is equals to the methods count, why can be? i dont get with the reason, Thanks any help.
You need to use the
Q_INVOKABLE
macro for each method you want to see in theQMetaObject
.From the documentation:
You can also use the
slots
macro. I thinkQ_INVOKABLE
may be more minimal, though.QMetaObject is only aware of signals, slots, properties and other invokable member functions, occasionally referred to as "meta-methods" as a group.
Also, for the first line of your example, you should (probably) just call
This isn't just cosmetic. The
dynamic_cast
would move type-checking to runtime, which isn't necessary if you know at compile time thatsomeClass
is a pointer to aQObject
-derived class. (dynamic_cast
ing toQObject*
will work, and will get you the correct QMetaObject because of virtual inheritance, but it's unnecessary, less safe, and unclear.)You don't actually need an instance of the class to get the meta-object:
This is possible because there is one QMetaObject per class, not per object.
For anyone who wants to know more about the meta-object system, I recommend coffee and the documentation. Usually you don't need to deal with QMetaObject instances directly, unless you're writing a scripting engine or something equally 'meta'. It's easy to unintentionally duplicate functionality Qt already provides.
Also,
Q_DECLARE_METATYPE
is not what you want.