web-dev-qa-db-ja.com

QMLのobjectName:プロパティとは何ですか、なぜ必要なのですか?id:プロパティとはどう違うのですか?

  1. QMLのobjectName:プロパティとは何ですか?
  2. このプロパティを持つコンポーネントはどれですか?
  3. なぜ必要なのですか?
  4. Id:プロパティとどう違うのですか?
  5. 代わりにid:プロパティを使用できないのはなぜですか?
4
Akiva

このプロパティは、オブジェクトの名前を保持します。 objectNameはQObjectのQStringプロパティで、デフォルトは空のQStringです。

通常、QtからQML要素を見つける必要があるときにこのプロパティを設定します。これにより、QML要素の信号、プロパティ、機能にQt(C++)コードからアクセスできます。

オートパイロットテストでは、このプロパティを使用してアプリケーションを内省します。

C++のQMLオブジェクトと対話する

QMLコンポーネントは、基本的には兄弟を持つ子と独自の子を持つオブジェクトツリーです。 QMLコンポーネントの子オブジェクトは、 QObject :: objectName プロパティと QObject :: findChild() を使用して見つけることができます。たとえば、MyItem.qmlのルートアイテムに子のRectangleアイテムがある場合:

import QtQuick 2.0

Item {
    width: 100; height: 100

    Rectangle {
        anchors.fill: parent
        objectName: "rect"
    }
}

子は次のように配置できます。

QObject *rect = object->findChild<QObject*>("rect");
if (rect)
    rect->setProperty("color", "red");

オブジェクトには、同じobjectNameを持つ複数の子があることに注意してください。たとえば、ListViewはデリゲートの複数のインスタンスを作成するため、デリゲートが特定のobjectNameで宣言されている場合、ListViewには同じobjectNameを持つ複数の子があります。この場合、 QObject :: findChildren() を使用して、一致するobjectNameを持つすべての子を検索できます。

警告:C++を使用して、オブジェクトツリーの奥深くにあるQMLオブジェクトにアクセスして操作することは可能ですが、このアプローチを外部から行わないことをお勧めしますアプリケーションのテストとプロトタイピング。 QMLとC++の統合の強みの1つは、C++ロジックおよびデータセットバックエンドとは別にQMLユーザーインターフェイスを実装できることです。C++側がQMLコンポーネントを深く操作して直接操作すると、この戦略が破られます。これにより、たとえば、新しいコンポーネントに必要なobjectNameが欠落している場合、QMLビューコンポーネントを別のビューに交換することが難しくなります。 C++実装では、QMLユーザーインターフェイスの実装とQMLオブジェクトツリーの構成について、できるだけ少ししか知らない方がよいでしょう。

objectName がテストに必要な場合、これは間違いなく価値があります。不要な場合、objectNameは明らかに追加しないでください。それらを追加するときは、 パフォーマンスに関する一般的なQMLガイドライン に従う必要があります。

ソース: objectNamesをQMLアイテムに追加するとメモリにどのような影響がありますか?

6
Sylvain Pineau

1:オブジェクトを名前で検索するために使用されます

2:それらすべて、QObjectから取得

3:自動操縦でテストケースからアプリを内観するために使用されます

4:よく分からない

5:IDは外部ツール(オートパイロットなど)から発見できるとは思わない

2
mhall119