Как создать "массивоподобное" свойство, которое 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;
};
Класс содержит одно свойство, которое представляет собой список 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 ответ
Вероятно, вы можете исправить это, возвращая ссылку на ваш QStringList, а не копию
QStringList& contents() { return m_contents; }
Более безопасный вариант - инкапсулировать доступ к содержимому, поэтому любую функцию, объявленную как слот, можно получить из JavaScript без проблем, поэтому
public slots:
void addContent(QString value) { m_contents << value;}
должен сделать трюк тоже