qsortfilterproxymodel.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 1,707 行 · 第 1/5 页

CPP
1,707
字号
               this, SLOT(_q_sourceLayoutChanged()));    disconnect(d->model, SIGNAL(modelReset()), this, SLOT(_q_sourceReset()));    QAbstractProxyModel::setSourceModel(sourceModel);    connect(d->model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),            this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex)));    connect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)),            this, SLOT(_q_sourceHeaderDataChanged(Qt::Orientation,int,int)));    connect(d->model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),            this, SLOT(_q_sourceRowsAboutToBeInserted(QModelIndex,int,int)));    connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)),            this, SLOT(_q_sourceRowsInserted(QModelIndex,int,int)));    connect(d->model, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),            this, SLOT(_q_sourceColumnsAboutToBeInserted(QModelIndex,int,int)));    connect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)),            this, SLOT(_q_sourceColumnsInserted(QModelIndex,int,int)));    connect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),            this, SLOT(_q_sourceRowsAboutToBeRemoved(QModelIndex,int,int)));    connect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)),            this, SLOT(_q_sourceRowsRemoved(QModelIndex,int,int)));    connect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),            this, SLOT(_q_sourceColumnsAboutToBeRemoved(QModelIndex,int,int)));    connect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)),            this, SLOT(_q_sourceColumnsRemoved(QModelIndex,int,int)));    connect(d->model, SIGNAL(layoutAboutToBeChanged()),            this, SLOT(_q_sourceLayoutAboutToBeChanged()));    connect(d->model, SIGNAL(layoutChanged()),            this, SLOT(_q_sourceLayoutChanged()));    connect(d->model, SIGNAL(modelReset()), this, SLOT(_q_sourceReset()));    d->clear_mapping();    reset();}/*!    \reimp*/QModelIndex QSortFilterProxyModel::index(int row, int column, const QModelIndex &parent) const{    Q_D(const QSortFilterProxyModel);    if (row < 0 || column < 0)        return QModelIndex();    QModelIndex source_parent = d->proxy_to_source(parent); // parent is already mapped at this point    IndexMap::const_iterator it = d->create_mapping(source_parent); // but make sure that the children are mapped    if (it.value()->source_rows.count() <= row || it.value()->source_columns.count() <= column)        return QModelIndex();    return d->create_index(row, column, it);}/*!  \reimp*/QModelIndex QSortFilterProxyModel::parent(const QModelIndex &child) const{    Q_D(const QSortFilterProxyModel);    if (!d->indexValid(child))        return QModelIndex();    IndexMap::const_iterator it = d->index_to_iterator(child);    Q_ASSERT(it != d->source_index_mapping.constEnd());    QModelIndex source_parent = it.key();    QModelIndex proxy_parent = d->source_to_proxy(source_parent);    return proxy_parent;}/*!  \reimp*/int QSortFilterProxyModel::rowCount(const QModelIndex &parent) const{    Q_D(const QSortFilterProxyModel);    QModelIndex source_parent = d->proxy_to_source(parent);    if (parent.isValid() && !source_parent.isValid())        return 0;    IndexMap::const_iterator it = d->create_mapping(source_parent);    return it.value()->source_rows.count();}/*!  \reimp*/int QSortFilterProxyModel::columnCount(const QModelIndex &parent) const{    Q_D(const QSortFilterProxyModel);    QModelIndex source_parent = d->proxy_to_source(parent);    if (parent.isValid() && !source_parent.isValid())        return 0;    IndexMap::const_iterator it = d->create_mapping(source_parent);    return it.value()->source_columns.count();}/*!  \reimp*/bool QSortFilterProxyModel::hasChildren(const QModelIndex &parent) const{    Q_D(const QSortFilterProxyModel);    QModelIndex source_parent = d->proxy_to_source(parent);    if (parent.isValid() && !source_parent.isValid())        return false;    if (!d->model->hasChildren(source_parent))        return false;    QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();    return m->source_rows.count() != 0 && m->source_columns.count() != 0;}/*!  \reimp*/QVariant QSortFilterProxyModel::data(const QModelIndex &index, int role) const{    Q_D(const QSortFilterProxyModel);    QModelIndex source_index = d->proxy_to_source(index);    if (index.isValid() && !source_index.isValid())        return QVariant();    return d->model->data(source_index, role);}/*!  \reimp*/bool QSortFilterProxyModel::setData(const QModelIndex &index, const QVariant &value, int role){    Q_D(QSortFilterProxyModel);    QModelIndex source_index = d->proxy_to_source(index);    if (index.isValid() && !source_index.isValid())        return false;    return d->model->setData(source_index, value, role);}/*!  \reimp*/QVariant QSortFilterProxyModel::headerData(int section, Qt::Orientation orientation, int role) const{    Q_D(const QSortFilterProxyModel);    IndexMap::const_iterator it = d->create_mapping(QModelIndex());    int source_section;    if (orientation == Qt::Vertical) {        if (section < 0 || section >= it.value()->source_rows.count())            return QVariant();        source_section = it.value()->source_rows.at(section);    }    else {        if (section < 0 || section >= it.value()->source_columns.count())            return QVariant();        source_section = it.value()->source_columns.at(section);    }    return d->model->headerData(source_section, orientation, role);}/*!  \reimp*/bool QSortFilterProxyModel::setHeaderData(int section, Qt::Orientation orientation,                                          const QVariant &value, int role){    Q_D(QSortFilterProxyModel);    IndexMap::const_iterator it = d->create_mapping(QModelIndex());    int source_section;    if (orientation == Qt::Vertical) {        if (section < 0 || section >= it.value()->source_rows.count())            return false;        source_section = it.value()->source_rows.at(section);    }    else {        if (section < 0 || section >= it.value()->source_columns.count())            return false;        source_section = it.value()->source_columns.at(section);    }    return d->model->setHeaderData(source_section, orientation, value, role);}/*!  \reimp*/QMimeData *QSortFilterProxyModel::mimeData(const QModelIndexList &indexes) const{    Q_D(const QSortFilterProxyModel);    QModelIndexList source_indexes;    for (int i = 0; i < indexes.count(); ++i)        source_indexes << d->proxy_to_source(indexes.at(i));    return d->model->mimeData(source_indexes);}/*!  \reimp*/QStringList QSortFilterProxyModel::mimeTypes() const{    Q_D(const QSortFilterProxyModel);    return d->model->mimeTypes();}/*!  \reimp*/Qt::DropActions QSortFilterProxyModel::supportedDropActions() const{    Q_D(const QSortFilterProxyModel);    return d->model->supportedDropActions();}/*!  \reimp*/bool QSortFilterProxyModel::dropMimeData(const QMimeData *data, Qt::DropAction action,                                         int row, int column, const QModelIndex &parent){    Q_D(QSortFilterProxyModel);    if ((row == -1) && (column == -1))        return d->model->dropMimeData(data, action, -1, -1, d->proxy_to_source(parent));    QModelIndex proxy_index = index(row, column, parent);    QModelIndex source_index = d->proxy_to_source(proxy_index);    return d->model->dropMimeData(data, action, source_index.row(), source_index.column(),                                  source_index.parent());}/*!  \reimp*/bool QSortFilterProxyModel::insertRows(int row, int count, const QModelIndex &parent){    Q_D(QSortFilterProxyModel);    if (row < 0 || count <= 0)        return false;    QModelIndex source_parent = d->proxy_to_source(parent);    if (parent.isValid() && !source_parent.isValid())        return false;    QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();    if (row > m->source_rows.count())        return false;    int source_row = (row >= m->source_rows.count()                      ? m->source_rows.count()                      : m->source_rows.at(row));    return d->model->insertRows(source_row, count, source_parent);}/*!  \reimp*/bool QSortFilterProxyModel::insertColumns(int column, int count, const QModelIndex &parent){    Q_D(QSortFilterProxyModel);    if (column < 0|| count <= 0)        return false;    QModelIndex source_parent = d->proxy_to_source(parent);    if (parent.isValid() && !source_parent.isValid())        return false;    QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();    if (column > m->source_columns.count())        return false;    int source_column = (column >= m->source_columns.count()                         ? m->source_columns.count()                         : m->source_columns.at(column));    return d->model->insertColumns(source_column, count, source_parent);}/*!  \reimp*/bool QSortFilterProxyModel::removeRows(int row, int count, const QModelIndex &parent){    Q_D(QSortFilterProxyModel);    if (row < 0 || count <= 0)        return false;    QModelIndex source_parent = d->proxy_to_source(parent);    if (parent.isValid() && !source_parent.isValid())        return false;    QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();    if (row + count > m->source_rows.count())        return false;    if ((count == 1)        || ((d->sort_column < 0) && (m->proxy_rows.count() == m->source_rows.count()))) {        int source_row = m->source_rows.at(row);        return d->model->removeRows(source_row, count, source_parent);    }    // remove corresponding source intervals    // ### if this proves to be slow, we can switch to single-row removal    QVector<int> rows;    for (int i = row; i < row + count; ++i)        rows.append(m->source_rows.at(i));    qSort(rows.begin(), rows.end());        int pos = rows.count() - 1;    bool ok = true;    while (pos >= 0) {        const int source_end = rows.at(pos--);        int source_start = source_end;        while ((pos >= 0) && (rows.at(pos) == (source_start - 1))) {            --source_start;            --pos;        }        ok = ok && d->model->removeRows(source_start, source_end - source_start + 1,                                        source_parent);    }    return ok;}/*!  \reimp*/bool QSortFilterProxyModel::removeColumns(int column, int count, const QModelIndex &parent){    Q_D(QSortFilterProxyModel);    if (column < 0 || count <= 0)        return false;    QModelIndex source_parent = d->proxy_to_source(parent);    if (parent.isValid() && !source_parent.isValid())        return false;    QSortFilterProxyModelPrivate::Mapping *m = d->create_mapping(source_parent).value();    if (column + count > m->source_columns.count())        return false;    if ((count == 1) || (m->proxy_columns.count() == m->source_columns.count())) {        int source_column = m->source_columns.at(column);        return d->model->removeColumns(source_column, count, source_parent);    }    // remove corresponding source intervals    QVector<int> columns;    for (int i = column; i < colum

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?