5

(已编辑)在原始问题中,我错误地假设 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 ???
        }
    }

我必须使用命名角色还是只能使用正确创建的索引?

4

3 回答 3

7

也许它可以帮助你:
在 QML 中使用 QStandardItemModel

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

GridView {
   anchors.fill: parent
   model: cppModel
   delegate: Rectangle {
      Text {
         text: display;
      }
   }
}
于 2012-08-23T13:12:58.633 回答
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 示例中都没有找到它。

于 2012-11-07T22:24:02.533 回答
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")
                  }
              }
           }
        }
    }
}
于 2012-12-19T09:22:04.117 回答