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;

};

クラスには、 のリストである 1 つのプロパティが含まれます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()すると、項目が追加されたリストのコピーを返す関数のみが呼び出されることがわかります。元のリストは変更されていません。

リストへの変更を永続化するにはどうすればよいですか?

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 に答える