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有嵌套模型那就太好了。谢谢你的建议。。。我会试试的