Signals und Slots

Alles rund um die Programmierung mit Qt
Antworten
einhorn
Beiträge: 31
Registriert: 4. April 2007 15:15

Signals und Slots

Beitrag von einhorn »

Hallo zusammen,

jetzt probiere ich, 'dataChanged()' aufzurufen.
Was ich bisher gemacht habe ist:

In mainwindow.h:

Code: Alles auswählen

signals:
void dataWasChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
In mainwindow.cpp:

Code: Alles auswählen

emit dataWasChanged(model->index(0, 0, QModelIndex()), model->index(0, 1, QModelIndex())); // I don't know if this range is correct
In pieview.cpp:

Code: Alles auswählen

connect( mWin, SIGNAL( dataWasChanged(const QModelIndex &, const QModelIndex &)),
	this, SLOT( dataChanged(const QModelIndex &, const QModelIndex &)));
Es kann kompiliert werden, aber wenn es läuft, generiert es einen 'Segmentation fault (core dumped)' ...

Jedesmal füge ich eine neue Werte nach der anderen in 'Row 0' ein,
also soll der Bereich von (0, 0) bis (0, 1) sein, glaube ich.
Wie kann ich dieses Problem lösen?
Ich bin für jede Hilfe dankbar!
Zuletzt geändert von einhorn am 18. November 2007 11:05, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

200 KB gepackt schau ich mir nicht an - ein Testcase ja, aber nicht sowas.
Ich würde mal sagen irgendwo ist etwas nicht initialisiert/ kommt NULL zurück --> debuggen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
einhorn
Beiträge: 31
Registriert: 4. April 2007 15:15

Beitrag von einhorn »

Es tut mir leid.
Nun ist es ganz minimal (Nur 7KB).
Dann, wie kann man dieses Problem lösen?
Dateianhänge
piechart.tar.gz
(7.09 KiB) 349-mal heruntergeladen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich bekomme keinen Absturz hin. Was sagt eigentlich der Debugger?

P.S.: Deine Rechnerzeit stimmt nicht...
einhorn
Beiträge: 31
Registriert: 4. April 2007 15:15

Beitrag von einhorn »

Ich habe es vergessen.
Du bekommst keinen Absturz, nur weil ich diesen Teil

Code: Alles auswählen

/*connect( mWin, SIGNAL( dataWasChanged(const QModelIndex &, const QModelIndex &)), 
   this, SLOT( dataChanged(const QModelIndex &, const QModelIndex &)));*/
in 'pieview.cpp' auskommentiert habe.

Ich lade die neue Version hoch.
Dateianhänge
piechart.zip
sorry, aber zipped
(9.08 KiB) 343-mal heruntergeladen
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Code: Alles auswählen

$ grep mWin *.cpp
main.cpp:       MainWindow mWindow;
main.cpp:       mWindow.setGraphWidget(&widget);
main.cpp:       mWindow.show();
pieview.cpp:    connect( mWin, SIGNAL( dataWasChanged(const QModelIndex &, const QModelIndex &)),
hmm.. und wo initialisierst du mWin? Der connect ist ja die einzige Stelle, wo du die Variabel überhaupt benötigst...
einhorn
Beiträge: 31
Registriert: 4. April 2007 15:15

Beitrag von einhorn »

Ich initialisiere '*mWin' in 'pieview.h' (nicht '.cpp'), wie:

Code: Alles auswählen

	MainWindow *mWin;
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ich habe Dir diese Frage nicht spasseshalber gestellt.. also nochmals: wo initialisierst/setzt du mWin....?
einhorn
Beiträge: 31
Registriert: 4. April 2007 15:15

Beitrag von einhorn »

Ach so! Ich habe die Variable nur 'definiert', noch nicht 'initialisiert'.

Ich habe in 'pieview.cpp'

Code: Alles auswählen

mWin = new MainWindow();
eingesetzt. Es ist gelaufen, aber es hat gar nichts gezeigt ...

Jetzt setze ich in 'pieview.h'

Code: Alles auswählen

 	void setMainWindow(MainWindow *mainWindow) {
		mWin = mainWindow;
	}
und in 'main.cpp'

Code: Alles auswählen

	GraphWidget widget;
	MainWindow mWindow;
	mWindow.setGraphWidget(&widget);
	PieView pView;
	pView.setMainWindow(&mWindow);
	mWindow.show();
ein. Es zeigt auch nichts.
Was mache ich falsch?
Dateianhänge
piechart.zip
(9.39 KiB) 356-mal heruntergeladen
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

einhorn hat geschrieben: Es zeigt auch nichts.
Das verwundert mich überhaupt nicht..
einhorn hat geschrieben: Was mache ich falsch?
Du entwickelst ohne Debugger und ohne wirklich verstanden zu haben, was du eigentlich machen möchtest...

Mal abgesehen davon läuft dein Programm nur rein zufällig ohne Absturz..

Schau dir mal die Reihenfolge an, wie du die Objekte erstellst...
füge mal

Code: Alles auswählen

  printf("hier connecte ich pieview und mainwindow\n");
in den Konstruktor "PieView::PieView(QWidget *parent)"

Danach fügst du

Code: Alles auswählen

  printf("hier setze ich mWin\n");
in die Funktion PieView::setMainWindow(...)

Danach lass dein Programm mal laufen und schreib mir dann, was für eine Ausgabe du erwarten würdest und was für eine Ausgabe dein Programm liefert...
einhorn
Beiträge: 31
Registriert: 4. April 2007 15:15

Beitrag von einhorn »

Ich bekomme:

Code: Alles auswählen

hier connecte ich pieview und mainwindow
Segmentation fault (core dumped)
Also wird 'PieView::setMainWindow(...)' nicht aufgerufen.

Jetzt setze ich 'connect()' in 'PieView::setMainWindow(...)'.
Es läuft! ... aber ich habe ein anderes Problem ...
Ich bekomme wieder einen 'Segmentation fault (core dumped)',
wenn ich eine Werte einsetzt (Strg + I).

Ich habe geschrieben, wie:

Code: Alles auswählen

cout << "gerade vor dataWasChanged()" << endl;
emit dataWasChanged(model->index(0, 0, QModelIndex()), model->index(0, 1, QModelIndex()));
cout << "gerade nach dataWasChanged()" << endl;
Dann ist die Ausgabe:

Code: Alles auswählen

gerade vor (dataWasChanged()
Segmentation fault (core dumped)
Also 'dataWasChanged(model->index(0, 0, QModelIndex()), model->index(0, 1, QModelIndex()))' zu emittieren ausfällt, glaube ich.
Sind diese Argumente gültig?
Dateianhänge
piechart.tar.gz
(6.98 KiB) 170-mal heruntergeladen
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Weißt Du eigentlich was ein Debugger ist? Mit diesem Tool hättest micht nur ganz einfach feststellen können, dass Du den Fehler an der falschen Stelle suchst, sondern hättest auch gleich erfahren, wo der Fehler tatsächtlich liegt:

Code: Alles auswählen

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1224087872 (LWP 8591)]
0x08056ceb in PieView::dataChanged (this=0xbf8266cc, topLeft=@0xbf824f14, bottomRight=@0xbf824ef4) at pieview.cpp:32
32          for (int row = 0; row < model()->rowCount(rootIndex()); ++row) {
(gdb)  
model() liefert einen Null-Pointer - daher der Absturz.

Für die Zukunft bitte ich Dich eindringlich, einen Debugger zu benutzen, dann findest Du solche Fehler auch selber!

Gruß Michael
einhorn
Beiträge: 31
Registriert: 4. April 2007 15:15

Beitrag von einhorn »

Ja, ich benutze KDevelop als ein Debugger, aber ich wußte nicht, wie man damit Fehler sucht.
Von jetzt an suche ich solche Fehler selber.
Wenn ich noch Frage habe, stelle ich sie wieder ...
Vielen Dank!
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Ja, ich benutze KDevelop als ein Debugger,
Wenn Du das Programm in kdevelop im Debugger startest, sollte der Cursor im Falle eines Segmentation fault sogar in der Programmzeile stehen, die den Fehler verursacht hat. Einfacher kann man Fehler gar nicht finden :-)

Gruß Michael
Antworten