我对 listview 元素和 c++ AbstractListModel 的供应有问题。
如果我通过 qproperty 传递列表模型,列表条目将正确显示。
如果我通过 qinvokable 传递列表模型,则仅在第一次调用页面时显示列表。如果我第二次调用该页面(无论使用相同还是不同的列表模型),列表仍为空。
ColumnLayout { anchors.fill: parent;
ListView { id: listview; Layout.fillWidth: true; Layout.fillHeight: true;
DelegateChooser {
id: items
role: "r_type"
DelegateChoice { roleValue: type1; SelectlistDelegateITL { p_height: p_listheight; p_width: list.width; p_index: index; p_column1: r_col1; p_column2: r_col2; p_isHeader: false }}
DelegateChoice { roleValue: type2; SelectlistDelegateI2TL { p_height: p_listheight; p_width: list.width; p_index: index; p_column1: r_col1; p_column2: r_col2; p_column3: r_col3; p_isHeader: false }}
}
//model: cp_screen.selectlistModelA
model: cp_screen.getSelectlistModelB()
//currentIndex: cp_screen.getSelectlistIndex(p_key)
currentIndex: 0
header: SelectlistDelegateI2TL { p_height: p_listheight; p_width: list.width; p_index: -1; p_column1: cp_screen.getListHeaderIcon(p_key); p_column2: cp_screen.getListHeaderText(p_key); p_isHeader: true }
delegate: items
spacing: p_listspacing
}
}
Q属性:
Q_PROPERTY(SelectlistModel* selectlistModelA READ getSelectlistModelA NOTIFY signalSelectlistModelChanged)
SelectlistModel* getSelectlistModelA() { return m_model->selectlistModels.first(); }
Q可调用:
Q_INVOKABLE SelectlistModel* getSelectlistModelB() { return m_model->selectlistModels.first(); }
当尝试通过QInvokable时,视图中仍然有相应的连接用于更新模型
Connections { target: cp_screen; function onSignalSelectlistModelChanged() { listview.model = cp_screen.getSelectlistModelB() } }
GetSelectListModelA 和 getSelectlistModelB 返回相同的模型
知道 QInvokable 方式出了什么问题吗?
在我看来,问题不在于分配模型,而在于模型本身。在前一种使用 Q_PROPERTY 的方法中,每次更改都会重新分配模型,这是不正确的。以下代码可能会给出与 Q_INVOKABLE 相同的结果:
Q_PROPERTY(SelectlistModel* selectlistModelA READ getSelectlistModelA CONSTANT)
这样,ListView 一次获取模型并在需要时说明其信息。现在的问题是为什么数据没有更新。具体答案需要查看您的 QAbstractListModel 继承类。然而,问题通常在于没有发出
dataChanged
信号。详细来说,模型收到新信息后,应该通知它更新视图:
QModelIndex topIndex = createIndex(first_row,0);
QModelIndex bottomIndex = createIndex(end_row,0);
emit dataChanged(topIndex,bottomIndex,QList<int>({roles}));
否则,ListView 保留初始值。此外,如果变化很大并且包括诸如
rowCount
之类的修改,则一种临时和未优化解决方案是重置整个模型,这应该给出与PROPERTY通知重新分配方法相同的结果:
beginResetModel();
endResetModel();
尽管除非有必要,否则应该避免。