将C ++类暴露给QML

时间:2016-07-25 16:15:59

标签: c++ qt 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的解决方案是什么?感谢

1 个答案:

答案 0 :(得分:3)

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

  1. 信号(Q_SIGNAL)或
  2. 一个广告位(Q_SLOT)或
  3. invokable(Q_INVOKABLE)。
  4. 在Qt 5中,插槽和可调用方法之间的区别仅在于,当您迭代其元对象数据时,该方法是否列在插槽中。除此之外,插槽和可调用方法是等效的。

    在Qt 5中,您可以从{+ 1}}从C ++到任何方法,即使它不是插槽/可调用的,但这些方法只有C ++编译器所知,not to QML