将C++类公开给QML

expose C++ class to QML

本文关键字:QML C++      更新时间:2023-10-16

我有这段代码。

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的解决方案是什么?感谢

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

  1. 信号(Q_SIGNAL),或者
  2. 时隙(Q_SLOT),或者
  3. 可调用(Q_INVOKABLE

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

在Qt 5中,您可以将connect从C++传递到任何方法,即使它不是槽/可调用的,但这样的方法只为C++编译器所知,而不是QML所知。