2016-08-02 73 views
0

我有C++/QT代碼Q_PROPERTY READ重載函數

// .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

可以混合部件和READ提供兩個訪問,也許。 – skypjack

回答

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. 歧義暴露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 OK,你需要通過QVariant採取一個可選的參數。有關QML重載的更多詳細信息,請參閱this question。例如: -

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) 
+0

我得到這個錯誤,TypeError:對象Foo(0x7ffcfb2d1660)的屬性'Index1'不是函數 – itsnevertoobadtoaskforhelp

+0

Q_INVOKABLE在公共區域以外不適用於我。它是否適用於您所顯示的代碼?它是一個版本的東西? – itsnevertoobadtoaskforhelp

+0

隨意公開。 –