Well sounds about right...
I Used the "Mysortfilterproxymodel" from the Qt Examples as my first goto... so just for completion some of it is still in here;
Mysortfilterproxymodel.h:
@
#include <QDate>
#include <QSortFilterProxyModel>
//! [0]
class MySortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
//Example for implementing it(no declarations) :
//
// myproxy=new MySortFilterProxyModel();
// myproxy->setSourceModel(sourcemodel);
// QRegExp regExp("NuMbeR1|Test3122|Dethklok");
// myproxy->setFilterRegExp(regExp);
// ui->view->setModel(myproxy);
// this implementation will now filter the given rows (not dynamicly given)
// after the regular [removed]NuMber1 OR Test3122 etc. etc.)
MySortFilterProxyModel(QObject *parent = 0);
//these are just included for purposes of completion,
//they should be safe to remove.
QDate filterMinimumDate() const { return minDate; }
void setFilterMinimumDate(const QDate &date);
QDate filterMaximumDate() const { return maxDate; }
void setFilterMaximumDate(const QDate &date);
//thill here not really nessecary
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
private:
bool dateInRange(const QDate &date) const;
QDate minDate;
QDate maxDate;
};
//! [0]
#endif
@
Mysortfilterproxymodel.cpp:
@
#include <QtGui>
#include "mysortfilterproxymodel.h"
//! [0]
MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent)
: QSortFilterProxyModel(parent)
{
}
//! [0]
//! [1]
void MySortFilterProxyModel::setFilterMinimumDate(const QDate &date)
{
minDate = date;
invalidateFilter();
}
//! [1]
//! [2]
void MySortFilterProxyModel::setFilterMaximumDate(const QDate &date)
{
maxDate = date;
invalidateFilter();
}
//! [2]
//! [3]
bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow,
const QModelIndex &sourceParent) const
{
//Depending on how many rows have to be filtered...
// 1. add new Indiezes
// 2. select the concerned rows
// 3.add them to your source model via return(just follow the example below)
QModelIndex index0 = sourceModel()->index(sourceRow, 5, sourceParent);
QModelIndex index1 = sourceModel()->index(sourceRow, 15, sourceParent);
QModelIndex index2 = sourceModel()->index(sourceRow, 0, sourceParent);
return (sourceModel()->data(index0).toString().contains(filterRegExp())
|| sourceModel()->data(index1).toString().contains(filterRegExp()))
&& dateInRange(sourceModel()->data(index2).toDate());
}
//! [3]
//! [4] //! [5]
bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
const QModelIndex &right) const
{
QVariant leftData = sourceModel()->data(left);
QVariant rightData = sourceModel()->data(right);
//! [4]
//! [6]
if (leftData.type() == QVariant::DateTime) {
return leftData.toDateTime() < rightData.toDateTime();
} else {
QRegExp emailPattern = new QRegExp("([\w\.]@[\w\.]*)");
QString leftString = leftData.toString();
if(left.column() == 1 && emailPattern->indexIn(leftString) != -1)
leftString = emailPattern->cap(1);
QString rightString = rightData.toString();
if(right.column() == 1 && emailPattern->indexIn(rightString) != -1)
rightString = emailPattern->cap(1);
return QString::localeAwareCompare(leftString, rightString) < 0;
}
}
//! [5] //! [6]
//! [7]
bool MySortFilterProxyModel::dateInRange(const QDate &date) const
{
return (!minDate.isValid() || date > minDate)
&& (!maxDate.isValid() || date < maxDate);
}
//! [7]
@
Hope it helps.
Sorry don't have too much time right now(obviously) but if there are other problems I will get to it as soon as possible.
I wish you a very happy Christmas and all good things in 2012!