Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QMetaObject::invokeMethod: No such method when using inheritance

I have got a super class Common, which inherits from QObject. Then I have got a class Item, which inherits from 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;
}

I want to use QMetaObject::invokeMethod to dynamically call a function. So I implemented a test function in the Item class, which takes exactly one string.

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

This does not work. I get the following error: QMetaObject::invokeMethod: No such method Common::test(QString), which is perfectly okay and fine, because the Common class has no test function.

How can I tell QMetaObject::invokeMethod, that it should call the method from the Item class?

like image 798
Niklas Avatar asked Jul 08 '14 22:07

Niklas


Video Answer


1 Answers

QMetaObject::invokeMethod can only invoke methods known to the Qt meta object system. These are slots and "invokable" functions, the latter being functions with the keyword Q_INVOKABLE before them.

So either write:

class Item : public Common {
    Q_OBJECT

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

or:

class Item : public Common {
    Q_OBJECT

public:
    Q_INVOKABLE void test(QString value);
    //^^^^^^^^^
};
like image 123
leemes Avatar answered Sep 19 '22 08:09

leemes