sortfilterproxymodel.cpp Example File

tableview/src/sortfilterproxymodel.cpp
/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/
#include "sortfilterproxymodel.h" #include <QtDebug> #include <QtQml> SortFilterProxyModel::SortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent), m_complete(false) { connect(this, &QSortFilterProxyModel::rowsInserted, this, &SortFilterProxyModel::countChanged); connect(this, &QSortFilterProxyModel::rowsRemoved, this, &SortFilterProxyModel::countChanged); } int SortFilterProxyModel::count() const { return rowCount(); } QObject *SortFilterProxyModel::source() const { return sourceModel(); } void SortFilterProxyModel::setSource(QObject *source) { setSourceModel(qobject_cast<QAbstractItemModel *>(source)); } QByteArray SortFilterProxyModel::sortRole() const { return m_sortRole; } void SortFilterProxyModel::setSortRole(const QByteArray &role) { if (m_sortRole != role) { m_sortRole = role; if (m_complete) QSortFilterProxyModel::setSortRole(roleKey(role)); } } void SortFilterProxyModel::setSortOrder(Qt::SortOrder order) { QSortFilterProxyModel::sort(0, order); } QByteArray SortFilterProxyModel::filterRole() const { return m_filterRole; } void SortFilterProxyModel::setFilterRole(const QByteArray &role) { if (m_filterRole != role) { m_filterRole = role; if (m_complete) QSortFilterProxyModel::setFilterRole(roleKey(role)); } } QString SortFilterProxyModel::filterString() const { return filterRegExp().pattern(); } void SortFilterProxyModel::setFilterString(const QString &filter) { setFilterRegExp(QRegExp(filter, filterCaseSensitivity(), static_cast<QRegExp::PatternSyntax>(filterSyntax()))); } SortFilterProxyModel::FilterSyntax SortFilterProxyModel::filterSyntax() const { return static_cast<FilterSyntax>(filterRegExp().patternSyntax()); } void SortFilterProxyModel::setFilterSyntax(SortFilterProxyModel::FilterSyntax syntax) { setFilterRegExp(QRegExp(filterString(), filterCaseSensitivity(), static_cast<QRegExp::PatternSyntax>(syntax))); } QJSValue SortFilterProxyModel::get(int idx) const { QJSEngine *engine = qmlEngine(this); QJSValue value = engine->newObject(); if (idx >= 0 && idx < count()) { QHash<int, QByteArray> roles = roleNames(); QHashIterator<int, QByteArray> it(roles); while (it.hasNext()) { it.next(); value.setProperty(QString::fromUtf8(it.value()), data(index(idx, 0), it.key()).toString()); } } return value; } void SortFilterProxyModel::classBegin() { } void SortFilterProxyModel::componentComplete() { m_complete = true; if (!m_sortRole.isEmpty()) QSortFilterProxyModel::setSortRole(roleKey(m_sortRole)); if (!m_filterRole.isEmpty()) QSortFilterProxyModel::setFilterRole(roleKey(m_filterRole)); } int SortFilterProxyModel::roleKey(const QByteArray &role) const { QHash<int, QByteArray> roles = roleNames(); QHashIterator<int, QByteArray> it(roles); while (it.hasNext()) { it.next(); if (it.value() == role) return it.key(); } return -1; } QHash<int, QByteArray> SortFilterProxyModel::roleNames() const { if (QAbstractItemModel *source = sourceModel()) return source->roleNames(); return QHash<int, QByteArray>(); } bool SortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { QRegExp rx = filterRegExp(); if (rx.isEmpty()) return true; QAbstractItemModel *model = sourceModel(); if (filterRole().isEmpty()) { QHash<int, QByteArray> roles = roleNames(); QHashIterator<int, QByteArray> it(roles); while (it.hasNext()) { it.next(); QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent); QString key = model->data(sourceIndex, it.key()).toString(); if (key.contains(rx)) return true; } return false; } QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent); if (!sourceIndex.isValid()) return true; QString key = model->data(sourceIndex, roleKey(filterRole())).toString(); return key.contains(rx); }