Hallo zusammen,
ich möchte inerhalb einer Tabelle unterschiedlich sortieren.
Ist das möglich?
Erklärung:
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
[gelöst] QTableView Tabelle nach mehreren Kriterien sortieren
[gelöst] QTableView Tabelle nach mehreren Kriterien sortieren
Zuletzt geändert von Mogli123 am 14. November 2018 13:21, insgesamt 1-mal geändert.
Re: QTableView in Tabelle nach mehreren Kriterien sortieren
Anbei meine Lösung:
table.cpp
.cpp
.h
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);
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;
}
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;
};