自定义ListModel初始化

时间:2018-08-20 17:26:14

标签: c++ qt go qml qabstractlistmodel

我正在尝试为QML应用程序编写自定义列表模型。我正在使用therecipe编写的golang桥,这使我可以编写用于生成相应C ++代码的golang。

现在,我想在需要动态加载其数据的屏幕之一中显示一个列表视图,因为它依赖于仅在运行时可用的变量。我不确定的是如何以一种不错的方式动态加载数据。有什么模式吗?现在,我在QML中使用Component.onCompleted函数,在其中调用ListModel的自定义插槽函数load(index int, flag bool)。然后根据两个给定的参数加载数据。

我想知道是否有更好的方法,因为我当前的实现有两个问题:

  1. 我不喜欢我必须手动调用此加载函数
  2. 有时,我的列表模型无法正确加载数据。发生这种情况是因为在加载组件后未调用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) }
    }
    ...
}

0 个答案:

没有答案