0

このコードを使用して、ChaiScript で一連の Qt オブジェクトのいくつかのプロパティを検証します。

    /// initialize the engine
    boost::shared_ptr<chaiscript::ChaiScript> chai;
    chai.reset(new chaiscript::ChaiScript());
    std::cout << "ChaiScript engine created!!!" << std::endl;


    ///
    /// register elements
    //
    assert(ui->checkBox);
    chai->add(chaiscript::var(ui->checkBox), "checkBox");

    ///
    /// adapt elements

    /// QCheckBox
    chai->add(chaiscript::fun(&QCheckBox::isTristate), "isTristate");
    chai->add(chaiscript::fun(&QCheckBox::isChecked), "isChecked");


    /// validate some properties
    try
    {
        chai->eval("print(\"Starting evaluation...\")");
        int answer_i = 0;
        bool answer_b = false;
        //answer_b = chai->eval<bool>("checkBox.isTristate()");
        answer_b = chai->eval<bool>("checkBox.isChecked()");

        std::cout << "ChaiScript::: " << answer_b << " :: " << answer_i << std::endl;
    }
    catch(std::exception e)
    {
        std::cout << "ChaiScript@Exception::: " << e.what() << std::endl;
    }

問題は、これが QCheckBox のネイティブ メソッドであるため、"isTristate()" 呼び出しが機能することです。一方、「isChecked()」呼び出しが失敗するのは、これが QAbstractButton クラスから継承されたメソッドであるためだと思います。

私は何を間違っていますか?

4

2 に答える 2

1

ChaiScriptの最新のSVNバージョンは、ユーザーが基本クラスの関係を追加できるようにすることで、この問題を解決します。

chai.add(base_class<Base, Derived>());

その後、答えが示すように、基本クラスのメソッドポインタ型を明確にする必要なしに、継承された関数呼び出しは期待どおりに機能します。

于 2010-08-04T22:12:33.790 に答える
0

この問題は次の方法で解決されました。

/// method binding
chai->add(chaiscript::fun<bool (QCheckBox *)>(&QCheckBox::isChecked), "isChecked");

親メソッドへの参照をバインドしないために、バインドされたメソッドが QCheckBox クラスに属していることを指定する必要があります。

乾杯!!!

于 2010-07-07T10:27:13.787 に答える