Qt信号在地址簿

时间:2017-09-22 16:56:08

标签: qt model-view-controller

我正在通过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;
}

1 个答案:

答案 0 :(得分:2)

记下发布代码的函数beginRemoveRows()中的函数调用endRemoveRows()removeRows()

beginRemoveRows()功能发出信号 rowsAboutToBeRemoved()。这是连接视图可以了解删除的方式,以及基础连接视图在删除数据之前必须处理的内容。

请查看以下文档中的注释:

https://doc.qt.io/qt-5/qabstractitemmodel.html#beginRemoveRows