akn*_*new 5 c++ qt master-detail qml
我想将 qml 与主从接口一起使用,但我不知道如何以正确的方式将当前项目传递到详细视图。主视图中的 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
}
}
}
Run Code Online (Sandbox Code Playgroud)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);
Run Code Online (Sandbox Code Playgroud)
在 qml 中:
Text {
id: simpleTextt
text: testObject.testField
anchors.centerIn: parent
}
Run Code Online (Sandbox Code Playgroud)
您可以使用委托的isCurrentItem属性将数据从 ListView 委托传递到详细信息 qml。这样您就可以摆脱困境而无需添加额外的 C++ 代码。这基本上是你的第二种方法,但没有 C++。您也不需要添加许多属性,只要您想要更改的每个 QML 元素都有一个id即可。
如果您有多个不同的 QML 用于不同的详细信息视图,您还必须使用加载器来加载适当的详细信息 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
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)