Возможно ли установить порядок по bool в QSortFilterProxyModel с помощью setSortRole ()?

Здравствуйте, у меня есть класс Filtro (по-английски это Filter), который является QSortFilterProxyModel, я установил ее sourceModel с классом myModel. MyModel класс является QAbstractListModel в этом классе, у меня есть

QList<Tile> m_recipes;

Класс плитки это:

class Tile {

public :
Tile (const QString &nameRecipe,const QString &color,const int &duration,const bool &userRecipe);
QString nameRecipe()const;
QString color() const;
int duration() const;
bool userRecipe() const;

private:

QString m_nameRecipe;
QString m_color;
int     m_duration;
bool    m_UserRecipe;
};

Теперь, когда я фильтрую список с помощью класса Filtro, я хочу показать в qml перед всеми элементами с m_UserRecipe == true и после всех элементов с m_UserRecipe == false.
Итак, мой вопрос: в QSortFilterProxyModel возможно установить порядок с ролью, которая представляет значение bool ??

QHash<int, QByteArray> myModel::roleNames() const
{

QHash <int,QByteArray> roles;
roles[NameRecipe]="NameRecipe";
roles[Color]="Color";
roles[Duration]="Duration";
roles[UserRecipe]="userRecipe";
return roles;

}

фильтро.х:

class Filtro : public QSortFilterProxyModel
{
Q_OBJECT

public:
Filtro(QObject* parent=0);
~Filtro();

Q_INVOKABLE void setStringaFiltro(QString string);
Q_PROPERTY(bool  showOnlyUserRic READ showOnlyUserRic WRITE setshowOnlyUserRic NOTIFY showOnlyUserRicChanged)
Q_PROPERTY(QString string READ string WRITE setstring NOTIFY stringChanged)

public slots:

void setshowOnlyUserRic(bool showOnlyUserRic);
bool showOnlyUserRic() const;

QString string() const;
void setstring(QString string);

signals:
void showOnlyUserRicChanged();
void oggettiFiltChanged();

void stringChanged();

private:

bool m_showOnlyUserRic;
int m_oggettiFilt;

QString m_string;

protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;

};

filtro.cpp

Filtro::Filtro(QObject *parent): QSortFilterProxyModel(parent)
, m_showOnlyUserRic(false)
,m_oggettiFilt(0)
,m_string("")
{
this->setSourceModel(&myModel);

}

Filtro::~Filtro()
{

}

void Filtro::setStringaFiltro(QString string)
{
this->setFilterCaseSensitivity(Qt::CaseInsensitive); // lo rendo case insensitive
this->setFilterFixedString(string);
}

QString Filtro::string() const
{
return m_string;
}

void Filtro::setstring(QString string)
{
if (m_string == string)
return;

m_string = string;
emit stringChanged();
invalidateFilter();  // fa rivalutare il filtro e quindi entra di nuovo in filterAcceptsRows()
}

bool Filtro::showOnlyUserRic() const
{
return m_showOnlyUserRic;
}

void Filtro::setshowOnlyUserRic(bool showOnlyUserRic)
{
if (m_showOnlyUserRic == showOnlyUserRic)
return;

m_showOnlyUserRic = showOnlyUserRic;
emit showOnlyUserRicChanged();

invalidateFilter();  // fa rivalutare il filtro e quindi entra di nuovo in filterAcceptsRows()

}bool Filtro::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{QRegExp regEx("*"+string()+"*");
regEx.setPatternSyntax(QRegExp::Wildcard);
regEx.setCaseSensitivity(Qt::CaseInsensitive);

if(showOnlyUserRic()==true) {
// se devo visualizzare solo
QModelIndex ricUtente = sourceModel()->index(source_row,0, source_parent); // vado a leggere singolarmente ogni riga del modello
QString stringaConfronto=sourceModel()->data(ricUtente,modello::NomeRicetta).toString();

if(sourceModel()->data(ricUtente,modello::RicettaUtente)==true && stringaConfronto.contains(regEx)==true)
{
// se è ricetta utente
return true;
}
else{

return false;
}

}
else{

QModelIndex ricUtente = sourceModel()->index(source_row,0, source_parent); // vado a leggere singolarmente ogni riga del modello
QString stringaConfronto=sourceModel()->data(ricUtente,modello::NomeRicetta).toString();
if(stringaConfronto.contains(regEx))
return true;
//        if(sourceModel()->data(ricUtente,modello::NomeRicetta)== string() )  //confronto il roles ricetta utene x filtrare il
//        {
//            return true;
//        }
return false;
}
}

1

Решение

Если вы хотите иметь заказ такого типа, вам просто нужно переписать lessThan метод:

bool Filtro::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
bool leftData = sourceModel()->data(left, modello::UserRecipe).toBool();
bool rightData = sourceModel()->data(right,  modello::UserRecipe).toBool();

if(leftData != rightData){
return leftData;
}
else
return QSortFilterProxyModel::lessThan(left, right);
}

Обновить:

ты должен позвонить sort(0)(число не имеет значения, поскольку оно сделано для модели с несколькими столбцами, но в вашем случае это не так.), также включите dynamicSortFilterи для последнего в вашем случае вы должны установить роль сортировки в modello::NomeRicetta:

Filtro::Filtro(QObject *parent): QSortFilterProxyModel(parent)
, m_showOnlyUserRic(false)
,m_oggettiFilt(0)
,m_string("")
{
setFilterRole(modello::RicettaUtente);
setSortRole(modello::NomeRicetta);
setDynamicSortFilter(true);
sort(0);
}

Полный пример можно найти на этом ссылка на сайт

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]