14

次の問題があります。

C++ でモデルを開発し、Qml でビューを開発し、コントローラーを介してそれらを接続しています。私のモデルでは、複数の計算を実行します。また、アプリケーションのユーザーに、qml で記述されたカスタム イベント ハンドラーを作成する可能性を提供します。ここで、固定小数点表記を使用することに決め、対応する C++ クラスを作成しました。ここで、FixedPoint クラス (そのすべての演算子を含む) を、私のアプリケーションを Qml で拡張することを決定した開発者に提供したいと考えています。これまでのところ、すべてのデータを QProperties として提供しましたが、これはコーディング ガイドラインで要求されています。しかし、私のチームでそれらについて話し合うために、他の解決策を受け入れます。明らかに、不動点は同一性ではなく、アルゴリズムはそれをコピーする可能性に依存していますが、これは QObject から継承する場合には許可されていません。

そこで質問が来ます: ID ではない C++ クラス / 構造体を QML に公開するにはどうすればよいですか?

コードの例:

struct FixedPoint
{
    FixedPoint(FixedPoint&);
    FixedPoint& operator=(FixedPoint&);
    ...
    int mantissa;
    int exponent;
}

C++ で記述された QQuickItem のプロパティ (値) として Qml で使用したい:

MyQmlObject{
    value{ mantissa: 134; exponent: 3 }
}

プロパティは、javascript での計算全体で使用され、途中で何度もコピーされます。したがって、値を FixedPoint* 型のプロパティにすることはできないと思います。私は正しいですか?

4

1 に答える 1

4

ご協力いただきありがとうございます。とにかくQObjectを使用することにしましたが、Wrapper方式です。つまり、実際の FixedPointValue を保持する FixPointWrapper (QObject を継承) を構築しただけです。それは計算に使用できます。複雑に聞こえますが、うまく機能します。私たちにとって特に重要なのは、FixedPoint 値をコピーして割り当てることができることです。したがって、ラッパーが必要です。

//QML
MyQmlObject{
    value {mantissa: 2; exponent: 4}
}


//C++
class MyQmlObject : public QQuickItem
{
    Q_Property( FixedPointWrapper* value ... )
}

class FixedPointWrapper : public QObject
{
    ...
    public slots:
       void setValue(FixedPoint){ //Forward to FixedPoint and implement your wanted effect. The same for getter} 
    private:
    FixedPoint value;    
}

最初は汚いハックのように感じましたが、もう少し考えた後、結果に耐えることができます.

もう一度、あなたの助けに感謝します。

于 2014-10-20T14:04:32.617 に答える