From 6a73ac97dfc70d09e860c53f42538287e90f2ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E5=AD=90=E6=A5=9A=5Czhuzi?= Date: Fri, 1 Mar 2024 00:19:41 +0800 Subject: [PATCH] fix bug #439 --- src/FluTableSortProxyModel.cpp | 60 ++++++++++++++++++++++++++++++++++ src/FluTableSortProxyModel.h | 28 ++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/FluTableSortProxyModel.cpp create mode 100644 src/FluTableSortProxyModel.h diff --git a/src/FluTableSortProxyModel.cpp b/src/FluTableSortProxyModel.cpp new file mode 100644 index 00000000..7a9344d0 --- /dev/null +++ b/src/FluTableSortProxyModel.cpp @@ -0,0 +1,60 @@ +#include "FluTableSortProxyModel.h" + +#include + +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<_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)); +} + diff --git a/src/FluTableSortProxyModel.h b/src/FluTableSortProxyModel.h new file mode 100644 index 00000000..c470f780 --- /dev/null +++ b/src/FluTableSortProxyModel.h @@ -0,0 +1,28 @@ +#ifndef FLUTABLESORTPROXYMODEL_H +#define FLUTABLESORTPROXYMODEL_H + +#include +#include +#include +#include +#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