我有我的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)给出了错误。重载读取函数的任何示例?
答案 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)
有两种可能的方法:
你应该:
Q_PROPERTY
中未提供的方法公开为invokable。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)