【问题标题】:Qt signal emit in addressbookQt 信号在地址簿中发出
【发布时间】:2017-09-22 16:56:08
【问题描述】:

我正在通过 AddressBook 示例学习 Qt 中的模型视图。 https://doc.qt.io/qt-5/qtwidgets-itemviews-addressbook-example.html 我发现了一些有趣的东西。该代码构建了一个基于 QAbstractTableModel 的 TableModel 类。在覆盖 setData 函数中,它发出 dataChanged 信号。但是,在 removeRows/insertRows 中没有发出信号。那么,这些函数如何更新视图呢。

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;
}

【问题讨论】:

    标签: qt model-view-controller


    【解决方案1】:

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

    beginRemoveRows() 函数,发出信号 rowsAboutToBeRemoved()。这就是连接视图如何知道删除以及在删除数据之前底层连接视图必须处理的方式。

    查看以下文档中的注释:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多