4

master-detail インターフェイスで qml を使用したいのですが、現在のアイテムを詳細ビューに正しく渡す方法がわかりません。マスター ビューの ListView は C++ モデル (QSQLTableModel のアドオン、正常に動作します) を使用しており、項目を渡す方法が 2 つあります。

  1. QSqlRecord フィールド名のような静的な名前を持つフィールドを持つ C++ クラスを作成し、w->rootContext()->setContextProperty()(w is QDeclarativeView *) を使用して qml に渡しますが、今ではこのようなクラスは使用せず、C++ コードを変更せずにデータベースと qml ビューを変更できます。保存したい

  2. qml のような詳細で多くのプロパティを作成します

    Rectangle {
      id: mainRect
      property alias myFieldName: txt_nominal.text
      Column {
    
        width: parent.width
        Text {
            id: txt_nominal
            font.bold: true
        }
      }
    }
    

このプロパティを c++ コードから設定して設定します w->rootContext()->setContextProperty(record.fieldName(i),record.field(i).value());(record - QSqlRecord at current row)

私の問題を解決する簡単な方法はありますか?

PS上記のコードは正確性をチェックしておらず、意味をより明確にするために書かれています

UPD

多分それは誰かにとって役に立つでしょう、私は3番目の方法を発見しました.2番目の変更ではなく、フィールドをQVariantMapにラップし、1つのオブジェクトだけをqmlに渡すことができます. これはまさに私が欲しかったものです

cpp で:

QVariantMap testObject;
testObject["testField"]="first string from cpp";
testObject["testField2"]="second string from cpp";
rootContext()->setContextProperty("testObject",testObject);

qmlで:

Text {
        id: simpleTextt
        text: testObject.testField
        anchors.centerIn: parent
    }
4

1 に答える 1

3

デリゲートのisCurrentItemプロパティを使用して、データを ListView デリゲートから詳細 qml に渡すことができます。そうすれば、C++ コードを追加しなくても済むようになります。これは基本的に 2 番目のアプローチですが、C++ は使用しません。また、変更する各 QML 要素にidがある限り、多くのプロパティを追加する必要はありません。

異なる詳細ビューに多数の異なる QML がある場合は、ローダーを使用して適切な詳細 QML をロードする必要もあります。

リスト内のすべての要素に対して詳細テンプレートが 1 つしかないことを前提としたおもちゃの例です (そうでない場合は、上記のように、detailsRectの代わりに loader を使用できます)。

Rectangle {
  width: 300; height: 400

  Rectangle {
    id: detailsRect
    anchors.right: parent.right
    width: 100
    height: 500
    color: "blue"
    Text {
      id: detailsText
      text: ""
    }
  }

ListView {
  id: list
  anchors.fill: parent
  model: 20

  delegate: Rectangle {
    color: ListView.isCurrentItem ? "red" : "green"
    width: 40
    height: 40

    Text {
        text: index
    }

    ListView.onIsCurrentItemChanged: {
        if(ListView.isCurrentItem)
        {
            detailsRect.color = "yellow"
            detailsText.text = index
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            list.currentIndex = index
        }
    }
  }
}
}
于 2012-11-30T13:06:12.450 に答える