Seite 1 von 2

Kreisdiagramm

Verfasst: 13. November 2007 13:24
von einhorn
Ich möchte einige bestimmte Daten in einem Kreisdiagramm in Echtzeit zeigen.
Ich habe das "Chart Example" geändert:

http://doc.trolltech.com/4.2/itemviews-chart.html

Aber es funktioniert nur das erste Mal, wenn ich neue Daten hinein reiche.
(Das heißt, nur der Anruf von Constructor funktioniert.)
Danach ändert sich das Kreisdiagramm gar nicht, auch wenn neue Daten immer geschickt werden.
Wie kann man das verbessern?

In graphwidget.cpp:

Code: Alles auswählen

graphWin->showChart2nd(nodes.count(), node->phiInOriginal);
In graphwindow.cpp:

Code: Alles auswählen

GraphWindow::GraphWindow()
{
	showChart2nd(8, phiInLocal);
}

void GraphWindow::showChart2nd(int nodeSize, double phiInChart)
{
	model->removeRows(0, model->rowCount(QModelIndex()), QModelIndex());

	for (int row=0; row<nodeSize; row++)
	{
		phiInChart += row; // just to show different values 

		model->insertRows(row, 1, QModelIndex());

		model->setData(model->index(row, 0, QModelIndex()), "Whatever");
		model->setData(model->index(row, 1, QModelIndex()), phiInChart); // this is the value I would like to show
		model->setData(model->index(row, 0, QModelIndex()), QColor("#99e600"), Qt::DecorationRole);
	}

	setWindowTitle(tr("Chart"));
	resize(640, 480);
}

Verfasst: 14. November 2007 01:22
von einhorn
Noch keine Antwort?

Ich denke, dass 'dataChanged()' nach 'setData()' fehlt.
Also habe ich in 'PieView.cpp' eine Methode hinzugefügt:

void PieView::callDataChanged()
{
emit dataChanged( model()->index(0, 0, rootIndex()) , model()->index(1, 1, rootIndex()) );
}

... Aber 'class PieView' wird von 'QAbstractItemView' geerbt.
Deshalb funktioniert "pieChart->callDataChanged()" nicht ...
Wie kann man das lösen?

Verfasst: 14. November 2007 09:07
von upsala
Ein minimal funktionsfähiges Beispiel und ein Programm das sich nicht nach 20sek. beendet wäre eine größere Hilfe...

Verfasst: 14. November 2007 11:16
von einhorn
Ich bin einverstanden.
Ein Moment, bitte.

Verfasst: 14. November 2007 12:43
von einhorn
Es tut mir leid.
Es ist noch schwer 'minimal' zu nennen, aber ich habe meine Code vereinfachert.
Es dauert, bis man 'Exit' von dem Menü auswählt.

Man kann sehen, wie 'phiInChart' sich ändert:

*************************
nodeSize : 2
phiInChart: 77.3781
*************************
:
:
*************************
nodeSize : 2
phiInChart: 22.6219
*************************

... aber das Diagramm ändert sich gar nicht.
Was das Diagram immer zeigt ist:

*************************
nodeSize : 4
phiInChart: 3.14
*************************

Diese Werte stammen aus dem Constructor: showChart(4, 3.14);

Ich denke, dass 'dataChanged()' nach 'setData()' fehlt.
Aber 'dataChanged()' in 'class Pieview' ist 'protected' und von 'QAbstractItemView' geerbt.
Deshablb bekomme ich eine Fehleranmeldung "error: ‘class QAbstractItemView’ has no member named ‘callDataChanged’",
wenn ich "pieChart->callDataChanged();" eintippe.
Wie kann man das lösen?

Verfasst: 14. November 2007 13:33
von ChMaster
servus,

ich seh einen riesen fehler, oder nur eine kleinen, definierst du überaupt
ein SIGNAL in der pieview.h? anscheinend nicht.

Code: Alles auswählen

// pieview.h
Q_SIGNALS:
  void dataIsChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);

// pieview.cpp
void PieView::dataChanged(const QModelIndex &topLeft,
                          const QModelIndex &bottomRight)
{
    QAbstractItemView::dataChanged(topLeft, bottomRight);

    validItems = 0;
    totalValue = 0.0;

    for (int row = 0; row < model()->rowCount(rootIndex()); ++row) {

        QModelIndex index = model()->index(row, 1, rootIndex());
        double value = model()->data(index).toDouble();

        if (value > 0.0) {
            totalValue += value;
            validItems++;
        }
    }
    viewport()->update();
    emit dataIsChanged( model()->index(0, 0, rootIndex()) , model()->index(1, 1, rootIndex()) );
}

// source wo du pieChart aufrufst
connect( pieChart, SIGNAL( dataIsChanged(const QModelIndex &, const QModelIndex &)), this, SLOT( dataChanged(const QModelIndex &, const QModelIndex &)));

Verfasst: 14. November 2007 13:44
von CaptnChaos
also bei mir funktioniert alles prima....
ich kann einen Wert ändern und das Diagramm wird aktualisiert und ich kann auch eine Datei laden und das Diagramm wird aktualisiert...
beschreib doch nochmal für dumme (für mich) wann denn was nicht funktioniert.

Verfasst: 14. November 2007 14:43
von einhorn
Danke schön, ich rufe in 'mainwindow.cpp' 'pieChart' auf, also habe ich in 'mainwindow.cpp'

Code: Alles auswählen

connect( pieChart, SIGNAL( dataIsChanged(const QModelIndex &, const QModelIndex &)), 
	this, SLOT( dataChanged(const QModelIndex &, const QModelIndex &))); 
... eingesetzt, dann bekomme ich die folgende Warningmeldung:

Code: Alles auswählen

Object::connect: No such slot MainWindow::dataChanged(QModelIndex,QModelIndex)
Meinst du so, oder mache ich etwas Falsches?
Funktioniert es bei dir?

Ich habe 'dataChanged()' kopiert und habe es in 'mainwindow.cpp' eingefügt.
Aber es funktioniert natürlich nicht, weil es von 'QAbstractItemView' nicht geerbt wird.

Verfasst: 14. November 2007 15:34
von einhorn
Hallo KernelPanic,

ich habe gemeint, dass ich 'phiInChart' im Diagramm zeigen wollte.
'phiInChart' ändert sich jede Sekunde, aber das Diagramm ändert sich nicht.
Ich kann leider kein Beispiel finden, dass ein Diagramm sich in Echtzeit ändert ...

Verfasst: 14. November 2007 15:41
von ChMaster
ist klar das "no such slot .." kommt da du kein slot definiert hast :D

füge das:

void dataChanged(const QModelIndex &, const QModelIndex &);

mal in deine mainwindow.h unter private slots ein und kommentiere mal
in deiner mainwindow.cpp void MainWindow::dataChanged wieder ein.
natürlich musst du dann dein viewport aktualisieren bzw. dein diagram
in diesem slot.

Verfasst: 14. November 2007 15:58
von einhorn
Leider habe ich das schon probiert. Ich bekomme die folgende Fehlermeldung:

g++ -c -g -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o graphwidget.o graphwidget.cpp
mainwindow.h:39: error: expected ‘,’ or ‘...’ before ‘&’ token
mainwindow.h:39: error: ISO C++ forbids declaration of ‘QModelIndex’ with no type
make: *** [graphwidget.o] Fehler 1

Es scheint, egal ob es 'private', 'public' oder 'protected slots:' ist ...
Mache ich noch etwas Falsces?
Diesmal lade ich die nicht-funktionierte Code hoch.

Verfasst: 14. November 2007 16:09
von ChMaster
inkludierst du auch die richtigen header in deiner mainwindow.h und
mainwindow.cpp? damit meine ich #include <QModelIndex>.

Verfasst: 14. November 2007 16:30
von einhorn
Die Fehlermeldung ist jetzt verschwunden,
weil ich alle header files in pieview.h kopiert und inkludiert habe.
Aber soll ich in 'mainwindow.cpp':

Code: Alles auswählen

void MainWindow::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{
	QAbstractItemView::dataChanged(topLeft, bottomRight);

	validItems = 0;
	totalValue = 0.0;
	
	for (int row = 0; row < model()->rowCount(rootIndex()); ++row) {

		QModelIndex index = model()->index(row, 1, rootIndex());
		double value = model()->data(index).toDouble();
	
		if (value > 0.0) {
			totalValue += value;
			validItems++;
		}
	}
	viewport()->update();
}
... auskommentieren? Sonst bekomme ich:

Code: Alles auswählen

g++ -c -g -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o mainwindow.o mainwindow.cpp
mainwindow.cpp: In member function ‘void MainWindow::dataChanged(const QModelIndex&, const QModelIndex&)’:
mainwindow.cpp:103: error: cannot call member function ‘virtual void QAbstractItemView::dataChanged(const QModelIndex&, const QModelIndex&)’ without object
mainwindow.cpp:105: error: ‘validItems’ was not declared in this scope
mainwindow.cpp:106: error: ‘totalValue’ was not declared in this scope
mainwindow.cpp:108: error: ‘((MainWindow*)this)->MainWindow::model’ cannot be used as a function
mainwindow.cpp:108: error: ‘rootIndex’ was not declared in this scope
mainwindow.cpp:110: error: ‘((MainWindow*)this)->MainWindow::model’ cannot be used as a function
mainwindow.cpp:111: error: ‘((MainWindow*)this)->MainWindow::model’ cannot be used as a function
mainwindow.cpp:118: error: ‘viewport’ was not declared in this scope
make: *** [mainwindow.o] Fehler 1
Wenn ich den Teil nicht auskommentiere, läuft es, aber ich bekomme wieder:

Code: Alles auswählen

Object::connect: No such slot MainWindow::dataChanged(QModelIndex,QModelIndex)
Danke schön für deine Geduld!

Verfasst: 14. November 2007 16:59
von ChMaster
Du kannst keine Parameter überschreiben die mit const deklariert wurden.
const ist die abkürzung für CONSTANT und diese sind schreibgeschützt.

du musst in dieser funktion dein diagram aktualisieren mit den Daten die
du vom SIGNAL bekommst, sprich QModelIndex.

also die klasse aufrufen, diagramm aktualisieren und dann müsste es funktionieren.

Verfasst: 14. November 2007 18:16
von einhorn
Es tut mir leid ... ich verstehe noch nicht ...
Genau welche 'const' soll ich löschen?

Wenn ich 'const' von 'dataChanged()' und 'dataIsChanged()' lösche,
bekomme ich diese Fehlermeldungen:
(Übrigens habe ich 'Q_SIGNALS:' zu 'signals' geändert.)

Code: Alles auswählen

g++ -c -g -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o mainwindow.o mainwindow.cpp
g++ -c -g -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o pieview.o pieview.cpp
pieview.cpp:25: error: prototype for ‘void PieView::dataChanged(const QModelIndex&, const QModelIndex&)’ does not match any in class ‘PieView’
pieview.h:32: error: candidate is: void PieView::dataChanged(QModelIndex&, QModelIndex&)
pieview.cpp: In member function ‘void PieView::dataChanged(const QModelIndex&, const QModelIndex&)’:
pieview.cpp:43: error: no matching function for call to ‘PieView::dataIsChanged(QModelIndex, QModelIndex)’
pieview.h:29: note: candidates are: void PieView::dataIsChanged(QModelIndex&, QModelIndex&)
make: *** [pieview.o] Fehler 1
Nach 'http://doc.trolltech.com/4.2/qabstracti ... html#index' gibt 'model()->index(0, 0, rootIndex())' 'const QModelIndex' zurück.
Deshalb kann ich 'const' von 'dataChanged()' und 'dataIsChanged()' nicht löschen, denke ich ...

Noch ein anderes Problem. Ich habe in 'mainwindow.h':

Code: Alles auswählen

int validItems;
double totalValue;
... als 'private' Variabeln eingefügt.
Ich habe auch im Constructor von 'mainwindow.cpp' diese Parameter wie

Code: Alles auswählen

validItems = 0;
totalValue = 0.0;
... initialisirt.
Aber 'rootIndex' wird in 'class QAbstractItemView' definiert.
Weil 'class MainWindow' schon von 'QMainWindow' geerbt wird,
ist es unmöglich, von 'QAbstractItemView' geerbt zu werden ...
Deswegen muss ich momentan die Methode 'void MainWindow::dataChanged(QModelIndex &topLeft, QModelIndex &bottomRight)' auskommentieren ...

Ich bin verloren ... hilf mir bitte ...