2012-12-19 6 views
6

Ich versuche QList Integer von QML zu C++ - Code zu übergeben, aber irgendwie funktioniert mein Ansatz nicht. Mit folgendem Ansatz mir immer folgende Fehlermeldung:Wie übergebe ich QList von QML nach C++/Qt?

left of '->setParentItem' must point to class/struct/union/generic type 
type is 'int *' 

Alle Eingaben Schwierigkeiten schießen die Frage hoch

geschätzt wird

Unten ist mein Code-Schnipsel

Header-Datei

Q_PROPERTY(QDeclarativeListProperty<int> enableKey READ enableKey) 

QDeclarativeListProperty<int> enableKey(); //function declaration 
QList<int> m_enableKeys; 

cpp-Datei

+2

'setParentItem' und' m_enableKeys' sind nicht Mitglieder der 'int', aber Sie versuchen, sie auf Schlüssel und ptrKey die beide int sind aufzurufen * das wird so nie .. – stijn

+0

erinnern arbeiten, dass' QDeclarativeListProperty'/'QQmlListProperty' ist nur nützlich, um eine readonly Liste von Unterobjekten zu liefern, die von QObject abgeleitet sind, und diese Liste kann nicht nach der Instanziierungszeit geändert werden. – TheBootroo

Antwort

7

Sie können QDeclarativeListProperty (oder QQmlListProperty in Qt5) nicht mit einem anderen Typ als QObject abgeleitete verwenden. So int oder QString wird nie funktionieren.

Wenn Sie eine QStringList oder eine QList oder etwas auszutauschen, die ein Array von einer der Grundtypen von QML, ist die einfachste Art und Weise unterstützt ist, es zu tun ist QVariant auf der C++ Seite zu verwenden, wie folgt aus:

#include <QObject> 
#include <QList> 
#include <QVariant> 

class KeyboardContainer : public QObject { 
    Q_OBJECT 
    Q_PROPERTY(QVariant enableKey READ enableKey 
       WRITE setEnableKey 
       NOTIFY enableKeyChanged) 

public: 
    // Your getter method must match the same return type : 
    QVariant enableKey() const { 
     return QVariant::fromValue(m_enableKey); 
    } 

public slots: 
    // Your setter must put back the data from the QVariant to the QList<int> 
    void setEnableKey (QVariant arg) { 
     m_enableKey.clear(); 
     foreach (QVariant item, arg.toList()) { 
      bool ok = false; 
      int key = item.toInt(&ok); 
      if (ok) { 
       m_enableKey.append(key); 
      } 
     } 
     emit enableKeyChanged(); 
    } 

signals: 
    // you must have a signal named <property>Changed 
    void enableKeyChanged(); 

private: 
    // the private member can be QList<int> for convenience 
    QList<int> m_enableKey; 
};  

auf der Seite QML, einfach eine JS Reihe von Nummer beeinflusst, wird die QML-Engine zu QVariant wandelt es automatisch, um es zu Qt verständlich zu machen:

KeyboardContainer.enableKeys = [12,48,26,49,10,3]; 

das ist alles!

+0

Aber ... was ist mit diesem Dokument? http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-data.html –

+1

In der obigen Dokumentation gibt es transparente Unterstützung für QList und QListString und QList und einige andere Sequenzen –