2012-12-19 34 views
6

Tôi đang cố gắng để vượt qua QList của số nguyên từ mã QML đến C++, nhưng bằng cách nào đó cách tiếp cận của tôi không hoạt động. Với phương pháp dưới đây đang nhận được lỗi sau:Làm cách nào để chuyển QList từ QML sang C++/Qt?

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

Bất kỳ đầu vào rắc rối shoot vấn đề được đánh giá cao

Dưới đây là đoạn mã của tôi

Tiêu đề tập tin

Q_PROPERTY(QDeclarativeListProperty<int> enableKey READ enableKey) 

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

cpp tệp

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' và' m_enableKeys' không phải là thành viên của 'int', nhưng bạn cố gắng gọi chúng trên khóa và ptrKey là cả int * để không bao giờ hoạt động .. – stijn

+0

hãy nhớ rằng' QDeclarativeListProperty'/'QQmlListProperty' chỉ hữu ích cho việc cung cấp danh sách chỉ đọc các mục con là các mục con QObject, và danh sách đó không thể sửa đổi sau thời gian instanciation. – TheBootroo

Trả lời

7

Bạn KHÔNG thể sử dụng QDeclarativeListProperty (hoặc QQmlListProperty trong Qt5) với bất kỳ loại nào khác so với loại xuất phát từ QObject. Vì vậy, int hoặc QString sẽ KHÔNG BAO GIỜ làm việc.

Nếu bạn cần trao đổi một QStringList hoặc QList hoặc bất kỳ thứ gì là một trong những kiểu cơ bản được QML hỗ trợ, cách dễ nhất để làm là sử dụng QVariant ở phía C++, như sau:

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

về phía QML, chỉ đơn giản là ảnh hưởng đến một mảng JS của số, động cơ QML sẽ tự động chuyển nó sang QVariant để làm cho nó dễ hiểu để Qt:

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

đó là tất cả!

+0

Nhưng ... về tài liệu này thì sao? http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-data.html –

+1

Trong tài liệu ở trên, có sự hỗ trợ minh bạch cho QList và QListString và QList và một số trình tự khác –

Các vấn đề liên quan