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
    }
  }
}
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
    }
您可以使用委托的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
        }
    }
  }
}
}