Как передать QList из QML в C ++ / Qt?

Я пытаюсь пройти 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);
}
}

6

Решение

Вы НЕ МОЖЕТЕ использовать QDeclarativeListProperty (или QQmlListProperty в Qt5) с любым другим типом, кроме производных от QObject. Так что int или QString НИКОГДА не будут работать.

Если вам нужно обменять QStringList или QList или что-либо, являющееся массивом одного из базовых типов, поддерживаемых QML, самый простой способ сделать это — использовать QVariant на стороне C ++, например так:

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

Это все !

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]