This commit is contained in:
朱子楚\zhuzi 2024-03-01 00:19:41 +08:00
parent e2d52f55b9
commit 6a73ac97df
2 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,60 @@
#include "FluTableSortProxyModel.h"
#include <QJSValueList>
FluTableSortProxyModel::FluTableSortProxyModel(QSortFilterProxyModel *parent)
: QSortFilterProxyModel {parent}
{
_model = nullptr;
connect(this,&FluTableSortProxyModel::modelChanged,this,[=]{
setSourceModel(this->model());
sort(0,Qt::AscendingOrder);
});
}
bool FluTableSortProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const{
return true;
}
bool FluTableSortProxyModel::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const{
return true;
}
bool FluTableSortProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const{
QJSValue comparator = _comparator;
if(comparator.isNull()){
return true;
}
QJSValueList data;
data<<source_left.row();
data<<source_right.row();
bool flag = comparator.call(data).toBool();
if(sortOrder()==Qt::AscendingOrder){
return !flag;
}else{
return flag;
}
}
void FluTableSortProxyModel::setSortComparator(QJSValue comparator){
this->_comparator = comparator;
if(sortOrder()==Qt::AscendingOrder){
sort(0,Qt::DescendingOrder);
}else{
sort(0,Qt::AscendingOrder);
}
}
QVariant FluTableSortProxyModel::getRow(int rowIndex){
QVariant result;
QMetaObject::invokeMethod(_model, "getRow",Q_RETURN_ARG(QVariant, result),Q_ARG(int, mapToSource(index(rowIndex,0)).row()));
return result;
}
void FluTableSortProxyModel::setRow(int rowIndex,QVariant val){
QMetaObject::invokeMethod(_model, "setRow",Q_ARG(int, mapToSource(index(rowIndex,0)).row()),Q_ARG(QVariant,val));
}
void FluTableSortProxyModel::removeRow(int rowIndex,int rows){
QMetaObject::invokeMethod(_model, "removeRow",Q_ARG(int, mapToSource(index(rowIndex,0)).row()),Q_ARG(int,rows));
}

View File

@ -0,0 +1,28 @@
#ifndef FLUTABLESORTPROXYMODEL_H
#define FLUTABLESORTPROXYMODEL_H
#include <QSortFilterProxyModel>
#include <QAbstractTableModel>
#include <QtQml/qqml.h>
#include <QJSValue>
#include "stdafx.h"
class FluTableSortProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY_AUTO(QAbstractTableModel*,model)
QML_NAMED_ELEMENT(FluTableSortProxyModel)
public:
explicit FluTableSortProxyModel(QSortFilterProxyModel *parent = nullptr);
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
bool filterAcceptsColumn(int sourceColumn, const QModelIndex &sourceParent) const override;
bool lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const override;
Q_INVOKABLE void setSortComparator(QJSValue comparator);
Q_INVOKABLE QVariant getRow(int rowIndex);
Q_INVOKABLE void setRow(int rowIndex,QVariant val);
Q_INVOKABLE void removeRow(int rowIndex,int rows);
private:
QJSValue _comparator;
};
#endif // FLUTABLESORTPROXYMODEL_H