web-dev-qa-db-ja.com

QMLおよびC ++ではNullおよびUndefined

C++で記述されたカスタムタイプでQMLを拡張するとき、私はJSとC++の違いについて疑問に思い始めました。

今回は、C++側のnull-チェックで十分かどうか、または「QUndefined」のようなものも考慮する必要があるのではないかと考えていました。私が見る限り、これは説明されていません ここ

または別の言い方をすると:

  • QML側でプロパティをundefinedに設定すると、C++側で何が起こりますか
  • QML側でプロパティをnullに設定すると、C++側で何が起こりますか
  • C++側でプロパティをnullに設定すると、QML側で何が起こりますか
8
derM

あなたは確かにあなたの答えで正しい軌道に乗っています、しかしここにいくつかのより多くの情報があります。

プロパティに書き込むとどうなりますか?たとえば、そのプロパティであるかどうかによって異なりますが、それはQObjectプロパティですか?など。プロパティのタイプによっては、割り当て時にエラーが発生する場合もあります(たとえば、doubleなどの数値タイプのプロパティにnullを書き込んでいる場合)。

答えのために、QObjectにプロパティを設定していると仮定しましょう。プロパティにQ_PROPERTYに定義されたundefined関数がある場合は、RESETに設定できます。 ドキュメントの引用

RESET機能はオプションです。これは、プロパティをコンテキスト固有のデフォルト値に戻すためのものです。たとえば、QWidget :: cursorには典型的なREADおよびWRITE関数、QWidget :: cursor()およびQWidget :: setCursor()があり、QWidget ::を呼び出さないため、RESET関数QWidget :: unsetCursor()もあります。 setCursor()は、コンテキスト固有のカーソルにリセットすることを意味します。 RESET関数はvoidを返す必要があり、パラメーターを取りません。

具体的には、RESET関数を持つQ_PROPERTYがある場合、そのプロパティにundefinedを書き込むと、 RESET関数が呼び出されます

プロパティをnullに設定する場合、答えはその最後の参照のすぐ上にあります。基本的に、プロパティにQObject*派生型が含まれている場合、 nullptrを格納します

あなたが尋ねる最後のケースは、C++側のプロパティにnullを割り当てることです。意図と目的のために、私はあなたがこのようなケースについて質問していると仮定しています:

Q_PROPERTY(QObjectDerived* myThing READ myThing NOTIFY myThingChanged);

...

QObjectDerived *myThing() { return m_myThing; }

...

void somethingElse() {
    m_myThing = 0; // or NULL, nullptr, whatever floats your boat
    emit myThingChanged();
}

この場合、このプロパティのQML側(myInstanceId.myThing)は、メモリからnullになります。

13
Robin Burchell