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 + -
显示快捷键?