c++ - QMetaObject::invokeMethod:使用继承时没有这样的方法

标签 c++ qt inheritance

我有一个父类(super class)Common,它继承自QObject。然后我得到了一个类Item,它继承自Common

Common.h

class Common : public QObject {
    Q_OBJECT

public:
    // some methods
};

Item.h

class Item : public Common {
    Q_OBJECT

public:
    // some methods
    void test(QString value);
};

Item.cpp

void Item::test(QString value) {
    qDebug() << value;
}

我想使用 QMetaObject::invokeMethod 来动态调用一个函数。 所以我在 Item 类中实现了一个测试函数,它只接受一个字符串。

Item* item = new Item();
QMetaObject::invokeMethod(item, "test", Qt::DirectConnection, Q_ARG(QString, "1234"));

这不起作用。我收到以下错误:QMetaObject::invokeMethod: No such method Common::test(QString),这完全没问题,因为 Common 类没有 测试函数。

如何告诉 QMetaObject::invokeMethod,它应该调用 Item 类的方法?

最佳答案

QMetaObject::invokeMethod 只能调用 Qt 元对象系统已知的方法。这些是插槽和“可调用”函数,后者是在它们之前带有关键字 Q_INVOKABLE 的函数。

所以要么写:

class Item : public Common {
    Q_OBJECT

public slots:
    // ^^^^^
    void test(QString value);
};

或:

class Item : public Common {
    Q_OBJECT

public:
    Q_INVOKABLE void test(QString value);
    //^^^^^^^^^
};

关于c++ - QMetaObject::invokeMethod:使用继承时没有这样的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642370/

相关文章:

c++ - 当我使用 C++ 继承时编译错误

c++ - 如何使用向后 cpp 在 ARM 上获取堆栈跟踪

c++ - 基于模板参数是否为 shared_ptr 的函数特化

c++ - 为什么 Eigen 不解析内置符号? (所有,最后,seq,等等...)

c++ - Qt:使用样式表将文本居中和左对齐

c++ - QString复制

c++ - 对象切片如何导致内存损坏?

C++ 范围-v3 : trying to chain together transforms

qt - 如何阻止鼠标中键单击取消选择 QGraphicsScene 中的项目而不阻止它从场景中的项目?

java - 将 Jlabel 添加到扩展类的面板中