我有我的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)
,但不能以这种方式通知更改。
有两种可能的方法:
您应该:
- 消除暴露给QML的名称的歧义
- 将
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)