从QML访问QStandardItemModel的项目

meo*_*lic 4 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);
}
Run Code Online (Sandbox Code Playgroud)

然后,我将模型注册到QML:

viewer.rootContext()->setContextProperty("cppModel",cppmodel);
Run Code Online (Sandbox Code Playgroud)

QStandardItemModel是一个表,不是吗?然后,我如何编写委托以在简单的GridView中显示项目:

    GridView {
        model: cppModel
        delegate: Rectangle {
            Text { text: ??? } //WHAT MUST BE USED HERE ???
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

ale*_*yuk 5

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

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

GridView {
   anchors.fill: parent
   model: cppModel
   delegate: Rectangle {
      Text {
         text: display;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

由于这个问题是3个月大,你可能已经有了答案,但是为了帮助别人:

简短的回答是使用:

datalist.currentIndex = index;
Run Code Online (Sandbox Code Playgroud)

例如,使用ListView,这对我有用:

ListView {
    id: datalist
    model: cppModel
    delegate: Rectangle {
        Text {
             text: display;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...

MouseArea {
    anchors.fill: parent;
    onClicked: {
        datalist.currentIndex = index;
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是每个人都需要的东西,但是我没有在任何ListView示例中找到它.