komischer titel, aber mir ist grade nichts anderes eingefallen.
Hab momentan nen kleines Problem, wo ich noch nicht so recht weiss wie ich das lösen soll. Ich habe hier eine Menge Daten in einem File die ich gerne adäquat in Form von Listviews unter versch. Kriterien darstellen möchte. Es kommen auch immer wieder neue Daten hinzu, die anhand der versch. Kriterien on the fly in die versch. Views eingefügt werden sollen. Die Daten haben immer die gleiche Form und sehen zeilenweise z.b. konkret so aus:
datum--zeit--verzeichnisgrösse--verzeichnis--kategorie
Ich möchte jetzt ein QTreeView, wo nur die Kategorien aufgelistet sind und sich mit Klick auf das entsprechende Element, alle anderen Listen automatisch nach den Kategorien filtern.
Und dann mehrere QTreeViews in jeweils einem tab von nem QTabWidget -> welche die Daten zusätzlich nochmal nach Zeit filtern sollen, also täglich, wöchentlich, monatlich, jährlich...
Mein Hauptproblem ist nun wie kann ich die einzelnen Listen unabhängig nach zeit noch filtern UND dabei, die innerhalb der Zeitspanne aufgelaufenen Dateigrössen aufsummieren. Weiss nicht wie ich das machen soll irgendwie...
Also im bsp daily würde eine zeile dann so ausehen:
datumstag--aufgelaufene Datengrössen an diesem Tag--
Ich habe mal den relevanten code unten angehängt. Ist sicherlich nurn kleines problem aber ich seh die Lösung irgendwie nicht, vielleicht kann mir jemand helfen.
die Daten einzulesen, und in einem QTreeView darzustellen soweit kein Problem:
Code: Alles auswählen
QFile file("./data.txt");
file.open(QIODevice::ReadOnly);
const QString data = file.readAll();
file.close();
const QStringList lines = data.split(QString("\n"));
QStandardItemModel *groups;
QStandardItemModel *model;
groups = new QStandardItemModel(0, 1);
groups->setHeaderData(0, Qt::Horizontal, QObject::tr("categorie"));
model = new QStandardItemModel(0, 5);
model->setHeaderData(0, Qt::Horizontal, QObject::tr("Date"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Time"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Size"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("Path"));
model->setHeaderData(4, Qt::Horizontal, QObject::tr("Categorie"));
int number = 0;
while (number < lines.count()) {
if (!lineData.isEmpty()) {
QStringList columnStrings = lineData.split("--", QString::SkipEmptyParts);
bool ok;
int day, month, year, hour, minute, second;
QStringList dateStrings = columnStrings[0].split(".", QString::SkipEmptyParts);
QStringList timeStrings = columnStrings[1].split(":", QString::SkipEmptyParts);
day = dateStrings[0].toInt(&ok, 10);
month = dateStrings[1].toInt(&ok, 10);
year = dateStrings[2].toInt(&ok, 10);
hour = timeStrings[0].toInt(&ok, 10);
minute = timeStrings[1].toInt(&ok, 10);
second = timeStrings[2].toInt(&ok, 10);
addData(model, QDate(year, month, day), QTime(hour, minute, second), columnStrings[2], columnStrings[3], columnStrings[4]);
addCategorie(groups, columnStrings[4]);
}
number++;
}
groupsGroupBox = new QGroupBox(tr("Categorie"));
statisticsGroupBox = new QGroupBox(tr("Statistics"));
groupsView = new QTreeView;
groupsView->setRootIsDecorated(false);
groupsView->setAlternatingRowColors(true);
groupsView->setModel(groups);
groupsView->setSortingEnabled(true);
sourceView = new QTreeView;
sourceView->setRootIsDecorated(false);
sourceView->setAlternatingRowColors(true);
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
sourceView->setModel(proxyModel);
sourceView->setSortingEnabled(true);
QTabWidget *statisticsTabWidget;
DailyTab *dailytab;
statisticsTabWidget = new QTabWidget;
dailytab = new DailyTab();
statisticsTabWidget->addTab(dailytab, tr("Daily"));
weeklytab = new WeeklyTab();
statisticsTabWidget->addTab(weeklytab, tr("Weekly"));
monthlytab = new MonthlyTab();
statisticsTabWidget->addTab(monthlytab, tr("Monthly"));
yearlytab = new YearlyTab();
statisticsTabWidget->addTab(yearlytab, tr("Yearly"));
connect(groupsView, SIGNAL(clicked(const QModelIndex) ), this, SLOT(groupInTreeItemClicked(const QModelIndex)));
Code: Alles auswählen
// added zu dem categorie model die einzelnen Kategorien, ohne Duplicate
void addCategorie(QStandardItemModel *groups1, const QString &groups)
{
QList<QStandardItem *> matchedItems = groups1->findItems(groups, Qt::MatchExactly, 0);
int count = model->rowCount();
if (matchedItems.isEmpty())
{
groups1->insertRow(0);
groups1->setData(groups1->index(0, 0), groups);
}
else
{
matchedItems.clear();
}
}
// added zu dem gesamt model die einzelnen Daten
void addData(QStandardItemModel *model, const QDate &date, const QTime &time, const QString &size, const QString &path, const QString &group)
{
int count = model->rowCount();
model->insertRow(count);
model->setData(model->index(count, 0), date);
model->setData(model->index(count, 1), time);
model->setData(model->index(count, 2), size);
model->setData(model->index(count, 3), path);
model->setData(model->index(count, 4), group);
}
Code: Alles auswählen
void groupInTreeItemClicked(const QModelIndex & index)
{
// bestimme Zeile die geklickt wurde
int row = index.row();
// hole handle zu dem item in der entsprechenden Zeile
QStandardItem *groupClicked = groups->item(row,0);
// hole text von Item zum vergleichen
QString groupClickedText = groupClicked->text();
// filtere alle entrys raus die den text nicht enthalten
dailytab->proxyModel->setFilterRegExp(QRegExp(groupClickedText, Qt::CaseSensitive, QRegExp::Wildcard));
// in Spalte nr 5
dailytab->proxyModel->setFilterKeyColumn(4);
}
Code: Alles auswählen
DailyTab::DailyTab() : QWidget()
{
dailyView = new QTreeView;
dailyView->setRootIsDecorated(false);
dailyView->setAlternatingRowColors(true);
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
dailyView->setModel(proxyModel);
dailyView->setSortingEnabled(true);
QVBoxLayout *dailyLayout = new QVBoxLayout;
dailyLayout->addWidget(dailyView);
setLayout(dailyLayout);
}