2016-07-25 119 views
1

我有这段代码。将C++类暴露给QML

class Pet 
{ 
    public: 
    Pet(const QString& nm) 
    : name(nm) 
    {} 

    const QString& name() const { return nm; } 

    private: 
    QString nm; 
} 

class Dog : public QObject, public Pet 
{ 
    Q_OBJECT 
    public: 
    Dog(QObject* prnt) 
    : QBject(prnt), 
     Pet("Tommy") 
    {} 
} 

揭露这QML

QQmlApplicationEngine engine; 
engine.rootContext()->setProperty("petDog", new Dog(&engine)); 

// QML项目

console.log(petDog.name()) // TypeError: Property 'name' of object Dog(0x0XXXXX) is not a function 

什么是揭露一个C++类QML的所有方法解决?谢谢

回答

3

元对象系统必须知道方法才能从QML调用。这意味着方法必须是:

  1. 的信号(Q_SIGNAL),或
  2. 的狭槽(Q_SLOT),或
  3. 可调用(Q_INVOKABLE)。

在Qt 5中,槽和可调用方法之间的区别仅仅在于当您迭代其元对象数据时该方法是否在槽中列出。除此之外,插槽和可调用方法是等价的。

在Qt 5中,您可以从C++将connect更改为任何方法,即使它不是插槽/可调用的,但只有C++编译器not to QML才知道这些方法。

+0

我想指出,看着提供的例子,你也可以将类成员设置为'Q_PROPERTY'。 – maxik

+0

@maxik这与可调用方法有什么关系? –

+3

提供的示例具有一个名为'name'的getter实例成员。在我看来,这适合'Q_PROPERTY'比'Q_INVOKABLE'好得多。通过这种方式设置'name()'方法也可以调用。 – maxik