我有一个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()
函数,该函数返回添加项目的列表的副本。原始列表未经修改。
如何保留对列表的更改?
答案 0 :(得分:0)
您可以通过返回对QStringList的引用而不是副本
来解决此问题QStringList& contents() { return m_contents; }
更安全的选择是封装对内容的访问,iirc任何声明了插槽的函数都可以从JavaScript访问而没有问题所以
public slots:
void addContent(QString value) { m_contents << value;}
也应该做的伎俩