2012-08-23 80 views
4

(EDITED)在原始問題中,我錯誤地認爲GridView本身使用2維模型。事實上,它與其他QML 視圖一樣,需要一個元素列表。爲了使問題和答案更容易理解,我稍微改變了給定代碼 。此外,我根據答案添加了工作解決方案。從QML訪問QStandardItemModel的項目

在主程序中我定義QStandardItemModel的一個實例:

QScopedPointer<QApplication> app(createApplication(argc, argv)); 
QmlApplicationViewer viewer; 

QStandardItemModel* cppmodel = new QStandardItemModel(); 
for (int i=0; i<100; i++) { 
    QStandardItem* item = new QStandardItem(QString("%1").arg(i,2,10,QChar('0'))); 
    cppmodel->appendRow(item); 
} 

然後,我註冊模式QML有:

viewer.rootContext()->setContextProperty("cppModel",cppmodel); 

QStandardItemModel是表,不是嗎?然後,我怎麼能寫一個委託 秀項,在一個簡單的GridView:

GridView { 
     model: cppModel 
     delegate: Rectangle { 
      Text { text: ??? } //WHAT MUST BE USED HERE ??? 
     } 
    } 

我必須使用命名角色或我可以只使用正確創建索引?

+2

嚴格來說,'QStandardItemModel'不是一個表格。它可以是_everything_(表格,樹和水平,我實際上無法表達,每列都有自己的孩子) – Lol4t0

回答

5

也許它可以幫助你:
Using QStandardItemModel in QML

您也可以嘗試這樣的代碼:

GridView { 
    anchors.fill: parent 
    model: cppModel 
    delegate: Rectangle { 
     Text { 
     text: display; 
     } 
    } 
} 
+0

哇,這是有效的。在官方文檔中我幾周沒有找到這樣簡單的「顯示」:-(現在,如果你還可以告訴我,如何更改以下代理擴展中的項目:'MouseArea {anchors.fill:parent; onClicked:{ ??? HowToChangeCurrentItem ???}}' – meolic

+0

如果我沒有弄錯,在這種情況下沒有辦法。 –

+0

同樣如何從QStandardItem設置圖標? – zar

5

由於這個問題是3個月大,你可能已經有一個答案,而是要幫助別人:

簡短的回答是使用:

datalist.currentIndex = index; 

例如,一個ListView,這個工作對我來說:

ListView { 
    id: datalist 
    model: cppModel 
    delegate: Rectangle { 
     Text { 
      text: display; 
     } 
    } 
} 

...

MouseArea { 
    anchors.fill: parent; 
    onClicked: { 
     datalist.currentIndex = index; 
    } 
} 

這似乎是一個東西大家都需要,但是我沒有任何的發現ListView的例子。

1

以下是該解決方案的完整實例。感謝所有幫助。

=== cppmodel.h ===

#include <QtDeclarative> 

class CppModel : public QStandardItemModel 
{ 
private: 
    Q_OBJECT 
public: 
    explicit CppModel(QObject *parent = 0) : QStandardItemModel(parent) {} 
public slots: 
    void setDataInModel(const int i, const QString& txt) { 
     setItem(i,new QStandardItem(txt)); 
    } 
}; 

=== main.cpp中===

#include <QtDebug> 
#include <QtGui/QApplication> 
#include "qmlapplicationviewer.h" 
#include "cppmodel.h" 

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 
    QmlApplicationViewer viewer; 

    CppModel* cppmodel = new CppModel(); 
    for (int i=0; i<100; i++) { 
     QStandardItem* item = new QStandardItem(QString("%1").arg(i,2,10,QChar('0'))); 
     cppmodel->appendRow(item); 
    } 

    viewer.rootContext()->setContextProperty("cppModel",cppmodel); 

    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setMainQmlFile(QLatin1String("main.qml")); 
    viewer.showExpanded(); 
    return app->exec(); 
} 

=== main.qml ===

import QtQuick 1.1 
import com.nokia.meego 1.0 

PageStackWindow { 
    id: appWindow  
    initialPage: mainPage  
    Page { 
     id: mainPage  
     GridView { 
      anchors.fill: parent 
      model: cppModel 
      delegate: Rectangle { 
       height: itemText.height; 
       width: itemText.width; 
       Text { 
       id: itemText 
       text: display; 
       } 
       MouseArea { 
        anchors.fill: parent; 
        onClicked: { 
         console.log("Clicked: "+index) 
         cppModel.setDataInModel(index,"XX") 
        } 
       } 
      } 
     } 
    } 
}