从QML访问QStandardItemModel的项目

时间:2012-08-23 12:22:02

标签: c++ qt qml

(编辑)在原始问题中,我错误地认为GridView本身使用二维模型。实际上,它需要与其他QML类似的元素列表 观点。为了使问题和答案更容易理解,我改变了给定的代码 略。此外,我根据答案添加了工作解决方案。

在主程序中,我定义了一个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 ???
        }
    }

我是否必须使用命名角色,或者我可以使用正确创建的索引吗?

3 个答案:

答案 0 :(得分:5)

也许它会帮助你:
Using QStandardItemModel in QML

你也可以尝试这样的代码:

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

答案 1 :(得分: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示例中找到它。

答案 2 :(得分: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")
                  }
              }
           }
        }
    }
}