Как создать «массивоподобное» свойство, которое JS-код может изменить на месте? - PullRequest
1 голос
/ 14 августа 2011

У меня есть класс 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;

};

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

// 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 Ответ

0 голосов
/ 14 августа 2011

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

QStringList& contents() { return m_contents; }

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

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

тоже надо делать

...