4

QML は初めてで、C++ オブジェクトの property.property へのアクセスに問題があります。

C++、周波数、ステーションはどちらも Qt メタタイプに登録されたオブジェクトです。

CStation *station = new CStation(...); // QObject
CFrequency *frequency = new CFrequency(..); // QObject
QQmlContext *qmlContext = viewer.rootContext();
qmlContext->setContextProperty("myatcstation", station);
qmlContext->setContextProperty("myfrequency", frequency);

QML:

 RowLayout { ....
        TextField {
            text: myatcstation.toQString(true)
        }
    }
 ....       text: myfrequency.toQString(true)

これは機能しますが、私が書くと:text: myatcstation.frequency.toQString(true)私は得ますTypeError: Object [object Object] has no method 'toQString'

frequencyCStationとして設定されたクラスのプロパティですQ_PROPERTY(CFrequency frequency READ getFrequency)

C++ でのクロスチェックは次のように機能します。

CFrequency test = station->property("frequency").value<CFrequency>();

-- 編集: フランクの答え --

どちらのクラスも から派生したものQObjectであり、コピー可能になっているため、教科書どおりではありません。私はアイデンティティ対価値の状況を認識しています。

基本的に頻度は値オブジェクトですが、私はそれQObjectをベースにしたので、それでプロパティを使用できます ( QML で非 QObject クラスを使用する機会を参照してください)。isの例でtoStringは、動作しない場合の頻度は、派生オブジェクトQ_INVOKABLEのコピーを返します。QObjectCFrequency

-- 編集: さらなる調査結果 --

周波数プロパティをCFrequency*代わりに返すように変更しCFrequencyても機能しません。私が得るようにTypeError: Cannot call method 'toQString' of undefined、状況は同じようです。CFrequencyだけでも動作しますが、QML はそれmyatcstation.frequencyが を持つ頻度オブジェクトであることを理解していませんtoString

4

2 に答える 2