我有一个BaseClass,它继承了QObject。它应该检查出于某种目的从它派生的类的可调用方法。我想知道在某个时候是否可以访问派生类的QMetaObject。下面是一个很小的例子
// class definition of base
class BaseClass : public QObject
{
Q_OBJECT
public:
explicit BaseClass(QObject *parent = nullptr);
Q_INVOKABLE int doSomething(const QString& input1);
};
// class definition of the derived class
class UserClass : public BaseClass
{
Q_OBJECT
public:
explicit UserClass(QObject* parent = nullptr);
Q_INVOKABLE int doSomethingElse(const QString& input1);
};和实现如下:
BaseClass::BaseClass(QObject *parent) : QObject(parent)
{
auto count = this->metaObject()->methodCount();
auto offset = this->metaObject()->methodOffset();
for(int i = offset ; i < count ; ++i)
{
auto method = this->metaObject()->method(i);
qDebug() << method.name() <<method.parameterNames();
}
}
int BaseClass::doSomething(const QString &input1)
{
return input1.toInt();
}
UserClass::UserClass(QObject *parent): BaseClass(parent)
{
}
int UserClass::doSomethingElse(const QString &input1)
{
return input1.length();
}当我实例化UserClass时,输出是"doSomething" ("input1"),这是非常正常的。BaseClass只是打印出自己的QMetaMethod信息。我想要的输出也应该包括"doSomethingElse" ("input1")。有谁知道实现这一目标的方法吗?
注意:我想访问这些信息,因为我想检查派生类,以便通过规则过滤它的一些方法。
编辑1:我知道Qt的元对象编译器是在编译时创建这些实现的,BaseClass不应该知道派生它的类的任何信息。
发布于 2019-12-08 07:49:08
好吧,我让它在某种程度上起作用了,但其他方法也受到欢迎。不可能在BaseClass的构造函数中直接这样做,因为派生类在这一点上没有实例化。因此,以下是我的实现:
BaseClass::BaseClass(QObject *parent) : QObject(parent)
{
QTimer::singleShot(0,this,[this](){this->check();});
}
void BaseClass::check()
{
auto count = this->metaObject()->methodCount();
auto offset = this->metaObject()->methodOffset();
for(int i = offset ; i < count ; ++i)
{
auto method = this->metaObject()->method(i);
qDebug() << method.name() <<method.parameterNames();
}
}当我尝试创建"doSomethingElse" ("input1")实例时,它会打印UserClass。
https://stackoverflow.com/questions/59233222
复制相似问题