Seite 1 von 1

[gelöst] QTableView Tabelle nach mehreren Kriterien sortieren

Verfasst: 13. November 2018 10:54
von Mogli123
Hallo zusammen,

ich möchte inerhalb einer Tabelle unterschiedlich sortieren.
Ist das möglich?

Erklärung:
Unbenannt.PNG
Unbenannt.PNG (8.59 KiB) 5216 mal betrachtet
In diesem Bild werden alle roten Spalten von der höchsten bis zur niedrigsten Zeit sortiert,
nachfolgen die gelben und grünen spalten je von der niedrigsten zur höchsten Zahl.
Dabei kann die Anzahl der einzelnen farbigen Spalten variieren.
Es ist also möglich das die Anzahl von roten Zeilen z. B. von 3 auf 5 steigt und anschliesend auf 2 sinkt.

Die Farben stehen schon in der Tabelle in einer versteckten Spalte.
Wie kann man so etwas umsetzen?

Vielen Dank für die Hilfe.

Gruß Mogli

Re: QTableView in Tabelle nach mehreren Kriterien sortieren

Verfasst: 14. November 2018 13:04
von Mogli123
Anbei meine Lösung:

table.cpp

Code: Alles auswählen

    mySorter = new sorter(this);
    mySorter->setSourceModel(myTableCustomiseToolChange);
    myTableview->setModel(mySorter);
    myTableview->setSortingEnabled(true);
    myTableview->model()->sort(0,Qt::DescendingOrder);
.cpp

Code: Alles auswählen

#include "sorter.h"

sorter::sorter(QObject *parent) : QSortFilterProxyModel(parent)
{

}

//Methoden

bool sorter::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{

    const int leftRow = source_left.row();
    const int rightRow= source_right.row();
    const QString leftColor = sourceModel()->index(leftRow,0,source_left.parent()).data().toString(); // get the colour data
    const QString rightColor = sourceModel()->index(rightRow,0,source_right.parent()).data().toString();

    switch(colorCompare(leftColor,rightColor))
    {
        case 1: return true;
        case -1: return false;
        default:

        if (leftColor == "red")
        {
            return
            sourceModel()->index(leftRow, 2, source_left.parent()).data()
            < sourceModel()->index(rightRow, 2, source_left.parent()).data();
        }
        else
        {
            return
            sourceModel()->index(leftRow, 2, source_left.parent()).data()
            > sourceModel()->index(rightRow, 2, source_left.parent()).data();

        }
    }
}

char sorter::colorCompare(const QString& left, const QString& right) const
{
    if(left==right)
    {
        return 0;
    }
    if(left == QLatin1String("green"))
    {
        return 1;
    }
    if(right== QLatin1String("green"))
    {
        return -1;
    }
    if(left == QLatin1String("yellow"))
    {
        return 1;
    }
    if(right== QLatin1String("yellow"))
    {
        return -1;
    }
    Q_UNREACHABLE();
    return -2;
}
.h

Code: Alles auswählen

#include "QSortFilterProxyModel"


class sorter : public QSortFilterProxyModel
{
    Q_OBJECT
    Q_DISABLE_COPY(sorter)

public:

    explicit sorter(QObject* parent = Q_NULLPTR);

protected:
    bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const Q_DECL_OVERRIDE;

private:
    char colorCompare(const QString& left, const QString& right) const;

};