2012-12-19 19 views
6

Sto provando a passare QList del numero intero da codice QML a C++, ma in qualche modo il mio approccio non funziona. Con avvicinamento al di sotto che ottiene seguente errore:Come passare QList da QML a C++/Qt?

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

Eventuali ingressi a disturbare il tiro il problema è molto apprezzato

Qui di seguito è il mio frammento di codice

file di intestazione

Q_PROPERTY(QDeclarativeListProperty<int> enableKey READ enableKey) 

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

file cpp

QDeclarativeListProperty<int> KeyboardContainer::enableKey() 
{ 
    return QDeclarativeListProperty<int>(this, 0, &KeyboardContainer::append_list); 
} 

void KeyboardContainer::append_list(QDeclarativeListProperty<int> *list, int *key) 
{ 
    int *ptrKey = qobject_cast<int *>(list->object); 
    if (ptrKey) { 
     key->setParentItem(ptrKey); 
     ptrKey->m_enableKeys.append(key); 
    } 
} 
+2

'' setParentItem' e m_enableKeys' non sono membri di 'int', ma si tenta di richiamare su di loro chiave e ptrKey che sono entrambi int * in modo che non funzionerà mai .. – stijn

+0

ricordare che' QDeclarativeListProperty'/'QQmlListProperty' è utile solo per fornire un elenco di elementi secondari di sola lettura che sono derivati ​​da QObject e che l'elenco non può essere modificato dopo il tempo di installazione. – TheBootroo

risposta

7

NON è possibile utilizzare QDeclarativeListProperty (o QQmlListProperty in Qt5) con qualsiasi altro tipo di quelli derivati ​​da QObject. Quindi int o QString non funzioneranno MAI.

Se avete bisogno di scambiare un QStringList o un QList o qualsiasi cosa che è un array di uno dei tipi di base supportati da QML, il modo più semplice per farlo è quello di utilizzare QVariant sul lato C++, in questo modo:

#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; 
};  

Sul lato QML, semplicemente influenzare una gamma JS del numero, il motore di QML convertirà automaticamente a QVariant per renderlo comprensibile a Qt:

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

Questo è tutto!

+0

Ma ... e questo documento? http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-data.html –

+1

Nella documentazione di cui sopra, c'è un supporto trasparente per QList e QListString e QList e alcune altre sequenze –