Qt 在QML中创建复杂列表模型

Qt 在QML中创建复杂列表模型,qt,listview,qml,qtquick2,listmodel,Qt,Listview,Qml,Qtquick2,Listmodel,我正在使用列表视图显示数据。为此,我使用组件作为委托,使用列表模型作为模型,在列表视图中创建行: 下图是设计的用例: 使用“代码>函数< /代码>,根据C++接收到的数据创建模型。但由于行和列都是动态的,而且每个小框都作为一个复选框来显示,因此我不知道如何填充/创建此模型 ListModel{ id:myListModel } function createModel(){ for(var rows = 0 ; rows < 10; rows++) {

我正在使用
列表视图
显示数据。为此,我使用
组件
作为委托,使用
列表模型
作为模型,在
列表视图
中创建行:

下图是设计的用例:

使用“代码>函数< /代码>,根据C++接收到的数据创建模型。但由于行和列都是动态的,而且每个小框都作为一个

复选框来显示,因此我不知道如何填充/创建此模型

ListModel{
    id:myListModel
}

function createModel(){
    for(var rows = 0 ; rows < 10; rows++)
    {
        ListModel.append({}) //How to add data to model like a group based on the row and col ?
    }
}
ListModel{
id:myListModel
}
函数createModel(){
对于(变量行=0;行<10;行++)
{
append({})//如何将数据添加到模型中,就像基于行和列的组一样?
}
}
作为复选框和列的每个小矩形都是动态的,如何将数据附加到
列表模型中


请建议。

我创建了一个基于
QAbstractListModel
的QML列表模型,您可以参考它并创建自己的模型

我为您的案例编写了一个演示,
Test
类存储具有两个属性的数据
checkBox1
checkBox2
,而
TestModel
Test
的列表容器

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "QmlListModel.h"

class Test : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool checkBox1 MEMBER mCheckBox1)
    Q_PROPERTY(bool checkBox2 MEMBER mCheckBox2)
public:
    explicit Test(bool checkBox1 = false,
                  bool checkBox2 = false):
        mCheckBox1(checkBox1),
        mCheckBox2(checkBox2){}

    bool    mCheckBox1;
    bool    mCheckBox2;
};

class TestModel : public QmlListModel<Test>
{
    Q_OBJECT
    QML_LIST_MODEL
public:
    explicit TestModel(){}
};

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    // register the TestModel for QML.
    qmlRegisterType<TestModel>("QmlListModel", 1, 0 , "TestModel");

    TestModel* testModel = new TestModel;

    for(int i = 0; i < 9; ++i){
        testModel->appendData(new Test(false, false));
    }

    QQmlApplicationEngine engine;
    // put the data into QML context, make you can access it.
    engine.rootContext()->setContextProperty("testModel", testModel);
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
    return app.exec();
}

#include "main.moc"
#包括
#包括
#包括
#包括“qmlistmodel.h”
类测试:公共QObject
{
Q_对象
Q_属性(bool checkBox1成员mCheckBox1)
Q_属性(bool checkBox2成员mCheckBox2)
公众:
显式测试(bool checkBox1=false,
bool checkBox2=false):
mCheckBox1(复选框1),
mCheckBox2(checkBox2){}
bool-mCheckBox1;
bool-mCheckBox2;
};
类TestModel:publicqmlistmodel
{
Q_对象
QML_列表_模型
公众:
显式TestModel(){}
};
int main(int argc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
//为QML注册TestModel。
qmlRegisterType(“QmlListModel”,1,0,“TestModel”);
TestModel*TestModel=新的TestModel;
对于(int i=0;i<9;++i){
testModel->appendData(新测试(假,假));
}
qqmlaplicationengine;
//将数据放入QML上下文中,使您能够访问它。
engine.rootContext()->setContextProperty(“testModel”,testModel);
发动机负荷(QUrl)(QStringletral(“qrc:///main.qml")));
返回app.exec();
}
#包括“main.moc”
以及如何在QML中使用:

import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Window 2.1

Window {
    visible: true
    width: test.width
    height: test.height

    Column {
        id: test
        spacing: 20
        Grid {
            columns: 3; rows: 3; spacing: 20
            Repeater {
                model: testModel
                delegate: Row {
                    CheckBox {
                        checked: checkBox1 // The property name
                        text: "checkBox1"
                        onCheckedChanged: testModel.get(index).checkBox1 = checked
                    }
                    CheckBox {
                        checked: checkBox2
                        text: "checkBox2"
                        onCheckedChanged: testModel.get(index).checkBox2 = checked
                    }
                }
            }
        }
        Button {
            text: "Debug"
            onClicked: {
                for(var i = 0; i < testModel.size(); i++){
                    console.log("index", i, "checkBox1 is", testModel.get(i).checkBox1);
                    console.log("index", i, "checkBox2 is", testModel.get(i).checkBox2);
                }
            }
        }
    }
}
导入QtQuick 2.2
导入QtQuick.Controls 1.2
导入QtQuick.Window 2.1
窗口{
可见:正确
宽度:test.width
高度:test.height
纵队{
id:测试
间距:20
网格{
列:3;行:3;间距:20
中继器{
模型:testModel
代表:世界其他地区{
复选框{
选中:checkBox1//属性名称
文本:“复选框1”
onCheckedChanged:testModel.get(index.checkBox1=checked
}
复选框{
选中:复选框2
文本:“复选框2”
onCheckedChanged:testModel.get(index.checkBox2=checked
}
}
}
}
钮扣{
文本:“调试”
再次点击:{
对于(var i=0;i
听起来你需要的东西更像是一个表视图而不是列表视图。@dtech在QT QUICK 2中没有
表视图
!!!可以使用二维模型。但是,
ListModel
不支持模型嵌套。你可以在这里使用这个家伙,也可以使用网格视图…@dtech谢谢你的链接,我从来没有使用过
AbstractItemModel
填充数据,我会尝试一下。如果QML有嵌套模型那就太好了。谢谢你的建议。。。我会试试的