Q_PROPERTY READ重载函数



我有我的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访问索引。指数使用taget的语法是什么。索引(int n),例如target。索引(8)给了我错误。有过载读取函数的例子吗?

遗憾的是,你想做的事情实际上是不可能的;

首先,您需要将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. 消除暴露给QML的名称的歧义
  2. Q_PROPERTY中未给定的方法暴露为可调用

例如:

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中过载的更多详细信息,请参阅此问题。例如:

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)

相关内容

  • 没有找到相关文章

最新更新