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 (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;
};