2012-11-30 34 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