首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问派生类的QMetaObject

访问派生类的QMetaObject
EN

Stack Overflow用户
提问于 2019-12-08 07:09:04
回答 1查看 101关注 0票数 0

我有一个BaseClass,它继承了QObject。它应该检查出于某种目的从它派生的类的可调用方法。我想知道在某个时候是否可以访问派生类的QMetaObject。下面是一个很小的例子

代码语言:javascript
复制
// 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);

};

和实现如下:

代码语言:javascript
复制
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不应该知道派生它的类的任何信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-08 07:49:08

好吧,我让它在某种程度上起作用了,但其他方法也受到欢迎。不可能在BaseClass的构造函数中直接这样做,因为派生类在这一点上没有实例化。因此,以下是我的实现:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59233222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档