我正在尝试为QML应用程序编写自定义列表模型。我正在使用therecipe编写的golang桥,这使我可以编写用于生成相应C ++代码的golang。
现在,我想在需要动态加载其数据的屏幕之一中显示一个列表视图,因为它依赖于仅在运行时可用的变量。我不确定的是如何以一种不错的方式动态加载数据。有什么模式吗?现在,我在QML中使用Component.onCompleted
函数,在其中调用ListModel的自定义插槽函数load(index int, flag bool)
。然后根据两个给定的参数加载数据。
我想知道是否有更好的方法,因为我当前的实现有两个问题:
rowCount()
函数。我不确定我的方法是否错误或是否犯了错误。你们通常如何初始化依赖于运行时变量的自定义列表模型?
我的自定义ListModel的代码如下:
type GroupEditModel struct {
core.QAbstractListModel
_ func() `constructor:"init"`
_ func(groupIndex int, slave bool) `slot:"load,auto"`
modelData []chai.Device
slave bool
groupIndex int
}
func (g *GroupEditModel) init() {
g.ConnectRowCount(g.rowCount)
g.ConnectData(g.data)
}
func (g *GroupEditModel) rowCount(*core.QModelIndex) int {
return len(g.modelData)
}
func (g *GroupEditModel) load(groupIndex int, slave bool) {
g.groupIndex = groupIndex
g.slave = slave
g.BeginResetModel()
if g.slave {
g.modelData = b.groups[g.groupIndex].Slaves()
} else {
g.modelData = b.groups[g.groupIndex].Masters()
}
g.EndResetModel()
}
func (g *GroupEditModel) data(index *core.QModelIndex, role int) *core.QVariant {
if role != int(core.Qt__DisplayRole) {
return core.NewQVariant()
}
device := g.modelData[index.Row()]
return core.NewQVariant25(map[string]*core.QVariant{
"id": core.NewQVariant10(device.ID()),
"name": core.NewQVariant14(device.Name()),
})
}
像这样的QML:
ListView {
...
model: GroupEditModel {
id: listModel
Component.onCompleted: { listModel.load(root.groupIndex, false) }
}
...
}