如何创建JS代码可以就地修改的“类数组”属性?

时间:2011-08-14 02:08:30

标签: qt qlistwidget qtscript

我有一个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的列表。如果我想将此类的实例公开给脚本,我可以使用以下命令:

// 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 :(得分:0)

您可以通过返回对QStringList的引用而不是副本

来解决此问题
QStringList& contents() { return m_contents; }

更安全的选择是封装对内容的访问,iirc任何声明了插槽的函数都可以从JavaScript访问而没有问题所以

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

也应该做的伎俩