Seite 1 von 1

Auswertung, Aufbereitung und Visualisierung von Daten...

Verfasst: 11. Mai 2007 14:54
von buggybear
Hi,

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))); 
Routinen zum hinzufügen der Daten zu den modellen:

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);
}
wenn im QTreeWidget welches die Kategorien darstellt auf eine kategorie geklickt wird, sollen in den entsprechenden Listen in den jeweiligen Tabs nur die Elemente angezeigt werden, die der Kategorie angehören, also wird folgender Slot ausgelöst... hier im Bsp DailyTab:

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

Der Code für die dailyTab Klasse sieht bis jetzt so aus:

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

Verfasst: 11. Mai 2007 20:29
von upsala
Häng zwischen den QTreeView's und deinem Model noch ein QAbstractProxyModel.

Verfasst: 11. Mai 2007 22:40
von buggybear
upsala hat geschrieben:Häng zwischen den QTreeView's und deinem Model noch ein QAbstractProxyModel.
Hast Du da vielleicht ein Beispiel zu, wie sowas ausehen kann? Weiss nicht so recht wie ich da anfangen soll...