1

我有一个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()调用函数,该函数返回添加项目的列表的副本。原始列表未修改。

如何保留对列表的更改?

4

1 回答 1

0

您可以通过返回对 QStringList 的引用而不是副本来解决此问题

QStringList& contents() { return m_contents; }

更安全的选择是封装对内容的访问,iirc 任何声明为插槽的函数都可以从 JavaScript 访问而不会出现问题,因此

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

也应该这样做

于 2011-08-14T17:24:25.767 回答