C++で記述されたカスタムタイプでQMLを拡張するとき、私はJSとC++の違いについて疑問に思い始めました。
今回は、C++側のnull
-チェックで十分かどうか、または「QUndefined
」のようなものも考慮する必要があるのではないかと考えていました。私が見る限り、これは説明されていません ここ 。
または別の言い方をすると:
undefined
に設定すると、C++側で何が起こりますかnull
に設定すると、C++側で何が起こりますかnull
に設定すると、QML側で何が起こりますかあなたは確かにあなたの答えで正しい軌道に乗っています、しかしここにいくつかのより多くの情報があります。
プロパティに書き込むとどうなりますか?たとえば、そのプロパティがであるかどうかによって異なりますが、それは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
になります。