Я пытаюсь пройти 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);
}
}
Вы НЕ МОЖЕТЕ использовать 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];
Это все !
Других решений пока нет …