我正在通过AddressBook示例学习Qt中的模型视图。 https://doc.qt.io/qt-5/qtwidgets-itemviews-addressbook-example.html 我发现了一些有趣的东西。该代码构造了一个在QAbstractTableModel上的TableModel类。在覆盖setData函数中,它发出dataChanged信号。但是,removeRows / insertRows中没有信号发出。那么,这些函数如何更新View。
bool TableModel::removeRows(int position, int rows, const QModelIndex &index)
{
Q_UNUSED(index);
beginRemoveRows(QModelIndex(), position, position + rows - 1);
for (int row = 0; row < rows; ++row) {
listOfPairs.removeAt(position);
}
endRemoveRows();
return true;
}
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && role == Qt::EditRole) {
int row = index.row();
QPair<QString, QString> p = listOfPairs.value(row);
if (index.column() == 0)
p.first = value.toString();
else if (index.column() == 1)
p.second = value.toString();
else
return false;
listOfPairs.replace(row, p);
emit(dataChanged(index, index));
return true;
}
return false;
}
答案 0 :(得分:2)
记下发布代码的函数beginRemoveRows()
中的函数调用endRemoveRows()
和removeRows()
。
beginRemoveRows()
功能发出信号 rowsAboutToBeRemoved()
。这是连接视图可以了解删除的方式,以及基础连接视图在删除数据之前必须处理的内容。
请查看以下文档中的注释:
https://doc.qt.io/qt-5/qabstractitemmodel.html#beginRemoveRows