2016-08-02 34 views
0

ich meine C++/QT CodeQ_PROPERTY READ überladene Funktion

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

Auf der QML Seite habe ich den Index target.Index zugreifen können. Wie lautet die Syntax für die Verwendung des Tags.Index (int n) zum Beispiel target.Index (8) gibt mir Fehler. Irgendwelche Beispiele für überladene Lesefunktion?

+0

Sie MEMBER und READ zwei Accessoren mischen, vielleicht zu liefern. – skypjack

Antwort

2

Was Sie versuchen zu tun, leider nicht wirklich möglich;

Zunächst Sie Q_INVOKABLE auf die überladene Methode hinzufügen bräuchten (oder einen Schlitz machen), um es dem QML-Engine zur Verfügung zu stellen:

Q_INVOKABLE int Index(int n) const; 

das würde bedeuten, dass target.index beides eine Funktion und ein int, und das ist natürlich nicht möglich (ist nicht in QML/JavaScript und auch nicht in C++). Qt scheint in diesem Fall der Eigenschaft Priorität zu geben, so dass Sie immer noch den Fehler "... ist keine Funktion" erhalten.

Sie werden wahrscheinlich die überladene Funktion umbenennen müssen.

Hinweis: Die QML-Engine behandelt Funktionsüberladungen (stellen Sie nur sicher, dass sie alle entweder Slots sind oder mit Q_INVOKABLE markiert sind), ohne eine Funktion und eine Eigenschaft mit demselben Namen zu haben. Sie könnten also sowohl target.Index() als auch target.Index(4) haben, aber Sie können auf diese Weise keine Änderungen melden.

1

Es gibt zwei mögliche Ansätze:

Sie sollten:

  1. die auf QML ausgesetzt Namen Disambiguieren.
  2. Expose die Methode nicht in Q_PROPERTY als aufrufbare gegeben.

Z. B .:

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(); 
}; 

Alternativ, wenn Sie mit der Verwendung von Funktionsschnittstelle von JavaScript anstelle von Eigentum Schnittstelle OK sind, müssen Sie über ein QVariant ein optionales Argument nehmen. Weitere Details zum Überladen in QML finden Sie unter this question. Z.B .:

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(); 
}; 

Die folgenden sind dann alle gültig:

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

ich diesen Fehler erhalten, Typeerror: Eigenschaft ‚Index1‘ das Objekt Foo (0x7ffcfb2d1660) ist keine Funktion – itsnevertoobadtoaskforhelp

+0

Q_INVOKABLE nicht außerhalb der öffentlichen Region für mich arbeiten. Funktioniert es für Sie als der Code, den Sie gezeigt haben? Ist es eine Versionssache? – itsnevertoobadtoaskforhelp

+0

Fühlen Sie sich frei, es öffentlich zu machen. –