qml + master-detail

时间:2012-11-30 08:52:55

标签: c++ qt qml master-detail

我想将qml与master-detail接口一起使用,但我不知道如何正确地将当前项传递给详细视图。主视图中的ListView使用C ++模型(QSQLTableModel的附加组件,它工作正常),我看到两种传递项目的方法:

  1. 使用带有静态名称的字段(如QSqlRecord字段名称)创建C ++类,并将其传递给qml并使用w->rootContext()->setContextProperty()(w是QDeclarativeView *),但现在我不使用任何类似这样的类并且可以更改我的数据库和qml视图没有更改c ++代码,我想保存它

  2. 在任何细节qml中创建很多属性,如

    Rectangle {
      id: mainRect
      property alias myFieldName: txt_nominal.text
      Column {
    
        width: parent.width
        Text {
            id: txt_nominal
            font.bold: true
        }
      }
    }
    
  3. 并通过设置w->rootContext()->setContextProperty(record.fieldName(i),record.field(i).value());(记录 - 当前行的QSqlRecort)从c ++代码设置此属性

    有没有更简单的方法来解决我的问题?

    PS我上面写的代码没有检查准确性,写的是为了更明确我的意思

    UPD

    也许它会对某些人有用,我发现了第三种方式,而不是第二种方式的修改 - 你可以将字段包装到QVariantMap中,只将一个对象传递给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
        }
    

1 个答案:

答案 0 :(得分:3)

您可以使用委托的 isCurrentItem 属性将ListView委托中的数据传递给您的详细信息qml。这样你就可以逃脱而不必添加额外的c ++代码。这基本上是你的第二种方法,但没有c ++。只要您要更改的每个QML元素都具有 id ,您也无需添加许多属性。

如果您有不同的QML用于不同的详细信息视图,您还必须使用Loader加载相应的详细信息QML。

只是一个玩具示例,假设您的列表中的所有元素只有一个详细信息模板(如上所述,如果不是这样,则可以使用loader而不是 detailsRect ):

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
        }
    }
  }
}
}