2012-12-19 14 views
6

Próbuję przekazać QList liczby całkowitej z QML do kodu C++, ale jakoś moje podejście nie działa. Z poniższej podejścia otrzymuję następujący błąd:Jak przekazać QList z QML do C++/Qt?

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

Jakiekolwiek wejścia do kłopotów strzelać kwestia jest wysoko ceniona

Poniżej jest mój urywek kodu

plik nagłówka

Q_PROPERTY(QDeclarativeListProperty<int> enableKey READ enableKey) 

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

plik 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

'' m_enableKeys' setParentItem' i nie są członkami 'int', ale spróbować wywołać je na klucz i ptrKey które są zarówno int * tak, że nigdy nie będzie działać .. – stijn

+0

pamiętać, że' QDeclarativeListProperty'/'QQmlListProperty' jest przydatny tylko do dostarczania listy elementów podrzędnych, które są tylko pochodnymi QObject, i listy tej nie można modyfikować po upływie czasu instancji. – TheBootroo

Odpowiedz

7

NIE MOŻNA używać QDeclarativeListProperty (lub QQmlListProperty w Qt5) z żadnym innym typem niż te pochodne QObject. Tak więc int lub QString NIGDY nie zadziała.

Jeśli trzeba wymienić QStringList lub qlist ani niczego, co jest tablicą jednym z podstawowych typów obsługiwanych przez QML, najprostszy sposób to zrobić jest użycie QVariant na C++ stronie, podobnie jak to:

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

na stronie QML, wystarczy mieć wpływ na tablicę JS Number, silnik QML automatycznie konwertować je do QVariant aby uczynić go zrozumiałym dla Qt:

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

to wszystko!

+0

Ale ... co z tym dokumentem? http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-data.html –

+1

W powyższej dokumentacji dostępna jest przezroczysta obsługa QList i QListString i QList oraz kilka innych sekwencji –