我想将qml与master-detail接口一起使用,但我不知道如何正确地将当前项传递给详细视图。主视图中的ListView使用C ++模型(QSQLTableModel的附加组件,它工作正常),我看到两种传递项目的方法:
使用带有静态名称的字段(如QSqlRecord字段名称)创建C ++类,并将其传递给qml并使用w->rootContext()->setContextProperty()
(w是QDeclarativeView *),但现在我不使用任何类似这样的类并且可以更改我的数据库和qml视图没有更改c ++代码,我想保存它
在任何细节qml中创建很多属性,如
Rectangle {
id: mainRect
property alias myFieldName: txt_nominal.text
Column {
width: parent.width
Text {
id: txt_nominal
font.bold: true
}
}
}
并通过设置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
}
答案 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
}
}
}
}
}