Как создать "массивоподобное" свойство, которое JS-код может изменить на месте?

У меня есть QObjectкласс, который выглядит следующим образом:

class TestObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QStringList contents READ contents WRITE setContents)

public:

    QStringList contents() { return m_contents; }
    void setContents(QStringList contents) { m_contents = contents; }

private:

    QStringList m_contents;

};

Класс содержит одно свойство, которое представляет собой список QStrings. Если я хочу представить экземпляр этого класса сценарию, я могу сделать это с помощью следующего:

// Instance
TestObject test_instance;

// Expose it to the script engine
QScriptEngine script_engine;
QScriptValue val;
val = script_engine.newQObject(&test_instance);
engine.globalObject().setProperty("TestObject", val);

Однако, когда я иду, чтобы добавить строку в список в коде Javascript, он на самом деле не добавляет строку:

TestObject.contents.push("Test string!");
print(TestObject.contents.length);

Результатом вышесказанного является 0, указывая, что строка не была добавлена ​​в список. Тщательное изучение кода, сгенерированного MOC, показывает, что когда свойство contents доступ только contents() вызывается функция, которая возвращает копию списка, в который добавлен элемент. Исходный список не изменен.

Как я могу сохранить изменения в списке?

1 ответ

Вероятно, вы можете исправить это, возвращая ссылку на ваш QStringList, а не копию

QStringList& contents() { return m_contents; }

Более безопасный вариант - инкапсулировать доступ к содержимому, поэтому любую функцию, объявленную как слот, можно получить из JavaScript без проблем, поэтому

public slots:
    void addContent(QString value) { m_contents << value;}

должен сделать трюк тоже

Другие вопросы по тегам