Q_PROPERTY READ重载函数

时间:2016-08-02 16:11:56

标签: qt qt5

我有我的C ++ / QT代码

// .hpp
Q_PROPERTY(int Index READ Index WRITE setIndex NOTIFY IndexChanged)

public:

int Index() const;
int Index(int n) const;
void setIndex(int index):

//.cpp
setContextProperty(QStringLiteral("target"), this)

在QML方面,我可以使用target.Index访问索引。使用taget.Index(int n)的语法是什么,例如target.Index(8)给出了错误。重载读取函数的任何示例?

2 个答案:

答案 0 :(得分:2)

你想要做的事情实际上是不可能的;

首先,您需要将Q_INVOKABLE添加到重载方法(或使其成为一个插槽),以使其可用于QML引擎:

Q_INVOKABLE int Index(int n) const;

这意味着target.index既是函数又是int,这当然是不可能的(不是在QML / JavaScript中,也不是在C ++中)。在这种情况下,Qt似乎优先考虑属性,所以你仍然会得到“......不是函数”错误。

您可能需要重命名重载函数。

注意:QML引擎确实处理函数重载(只是确保它们都是插槽或用Q_INVOKABLE标记),只是没有函数和同名属性。因此,您可以同时拥有target.Index()target.Index(4),但无法以这种方式通知更改。

答案 1 :(得分:1)

有两种可能的方法:

你应该:

  1. 消除暴露于QML的名称。
  2. Q_PROPERTY中未提供的方法公开为invokable。
  3. E.g:

    class Foo : public QObject {
      Q_OBJECT
      Q_PROPERTY(int Index READ Index WRITE setIndex NOTIFY IndexChanged)
      // QML Interface
      Q_INVOKABLE int Index1(int n) const { return Index(n); }
    public:
      // C++ interface
      int Index() const;
      int Index(int n) const;
      void setIndex(int index);
      Q_SIGNAL void IndexChanged();
    };
    

    或者,如果您使用JavaScript中的函数接口代替属性接口,那么您需要通过QVariant获取可选参数。有关QML中重载的更多详细信息,请参阅this question。 E.g:

    class Foo : public QObject {
      Q_OBJECT
      Q_PROPERTY(int IndexProp READ Index WRITE setIndex NOTIFY IndexChanged)
      // QML interface
      Q_INVOKABLE int Index(const QVariant & n) const {
        if (n.isValid())
          return Index(n.toInt());
        return Index();
      }
    public:
      // C++ interface
      int Index() const;
      int Index(int n) const;
      void setIndex(int index);
      Q_SIGNAL void IndexChanged();
    };
    

    以下均有效:

    target.IndexProp = 5
    foo = target.IndexProp
    foo = target.Index()
    foo = target.Index(2)