qml + 主从

akn*_*new 5 c++ qt master-detail qml

我想将 qml 与主从接口一起使用,但我不知道如何以正确的方式将当前项目传递到详细视图。主视图中的 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
        }
      }
    }
    
    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)

Jul*_*usG 3

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