Seite 1 von 1
Signals und Slots
Verfasst: 16. November 2007 18:45
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!
Verfasst: 16. November 2007 20:19
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.
Verfasst: 18. November 2007 11:04
von einhorn
Es tut mir leid.
Nun ist es ganz minimal (Nur 7KB).
Dann, wie kann man dieses Problem lösen?
Verfasst: 18. November 2007 11:15
von upsala
Ich bekomme keinen Absturz hin. Was sagt eigentlich der Debugger?
P.S.: Deine Rechnerzeit stimmt nicht...
Verfasst: 18. November 2007 11:48
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.
Verfasst: 18. November 2007 12:18
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...
Verfasst: 18. November 2007 12:26
von einhorn
Ich initialisiere '*mWin' in 'pieview.h' (nicht '.cpp'), wie:
Verfasst: 18. November 2007 12:33
von solarix
Ich habe Dir diese Frage nicht spasseshalber gestellt.. also nochmals: wo initialisierst/setzt du mWin....?
Verfasst: 18. November 2007 12:39
von einhorn
Ach so! Ich habe die Variable nur 'definiert', noch nicht 'initialisiert'.
Ich habe in 'pieview.cpp'
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?
Verfasst: 19. November 2007 08:48
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
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...
Verfasst: 19. November 2007 10:14
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?
Verfasst: 19. November 2007 15:55
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
Verfasst: 19. November 2007 16:48
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!
Verfasst: 19. November 2007 19:57
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