2012-11-30 96 views
3

我想使用qml和master-detail界面,但我不知道如何将当前项目传递给detail view right方式。在主视图中的ListView控件使用C++模型(附加与QSqlTableModel的,它的做工精细),我看到两种方式来传递项目:qml + master-detail

  1. 与静态名称字段,如QSqlRecord字段名称创建C++类,并将其传递到qml与​​(w是QDeclarativeView *),但现在我不使用任何这样的类,可以更改我的数据库和qml视图,而无需更改C++代码,我想保存它

  2. 创建很多性质在任何细节qml like

    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());设置为从C++代码这个属性(记录 - QSqlRecort在当前行)

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

PS我上面写的代码不检查的准确性,并写入,使其更清楚我的意思

UPD

也许这将是有用的人,我发现3-第二种方式,而不是第二种修改 - 你可以将字段封装到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

您的C++模型是否已经包含了所有将在详细视图中显示的字段,或者您是否必须为细节视图执行一些额外的数据提取? – JuliusG

+0

模型alredy有所有的字段,我知道哪些字段有当前模型(程序有一些表层次结构,任何表都有他自己的qml视图,在此视图之间转换为C++代码描述)。 – aknew

回答

3

你可以使用委托的isCurrentItem属性从ListView的代表将数据传递到您的详情qml。这样你就可以离开而不必添加额外的C++代码。这基本上是你的第二种方法,但没有C++。只要您想要更改的每个QML元素都有ID,您也不需要添加许多属性。

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

只是一个玩具例子假设你已经在列表中只为你所有的元素之一细节模板(如上面提到的,如果这是不是比你可以用装载机代替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 
     } 
    } 
    } 
} 
} 
+0

感谢您的帮助,但我决定使用我的第二种方法,但有一个例外 - 事实证明,如果属性声明,setContentProperty不能使用相同的名称,并且在没有任何别名的情况下工作,如果您编写类似于文本的内容:MyFieldName – aknew