6

我正在尝试将QList整数从 QML 传递到 C++ 代码,但不知何故我的方法不起作用。使用以下方法会出现以下错误:

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

高度赞赏解决问题的任何输入

下面是我的代码片段

头文件

Q_PROPERTY(QDeclarativeListProperty<int> enableKey READ enableKey) 

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

.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);
    }
}
4

1 回答 1

7

除了 QObject 派生的类型之外,您不能将 QDeclarativeListProperty(或 Qt5 中的 QQmlListProperty)与任何其他类型一起使用。所以 int 或 QString 永远不会工作。

如果您需要交换 QStringList 或 QList 或任何由 QML 支持的基本类型之一的数组,最简单的方法是在 C++ 端使用 QVariant,如下所示:

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

在 QML 方面,只需影响一个 Number 的 JS 数组,QML 引擎会自动将其转换为 QVariant 以使其对 Qt 可理解:

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

就这样 !

于 2013-03-26T16:18:28.267 回答