[gelöst] QTableView Tabelle nach mehreren Kriterien sortieren

Alles rund um die Programmierung mit Qt
Antworten
Mogli123
Beiträge: 13
Registriert: 25. September 2018 07:37

[gelöst] QTableView Tabelle nach mehreren Kriterien sortieren

Beitrag von Mogli123 » 13. November 2018 11:54

Hallo zusammen,

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

Erklärung:
Unbenannt.PNG
Unbenannt.PNG (8.59 KiB) 1333 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
Zuletzt geändert von Mogli123 am 14. November 2018 14:21, insgesamt 1-mal geändert.

Mogli123
Beiträge: 13
Registriert: 25. September 2018 07:37

Re: QTableView in Tabelle nach mehreren Kriterien sortieren

Beitrag von Mogli123 » 14. November 2018 14:04

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;

};

Antworten