[gelöst] QDialog mit FileChooser

Alles rund um die Programmierung mit Qt
Antworten
Eddie
Beiträge: 14
Registriert: 17. Juli 2007 19:36

[gelöst] QDialog mit FileChooser

Beitrag von Eddie »

Ich benutze einen Dialog, den ich im Designer erstellt habe. Auf ihn habe ich einen FileChooser gepackt. Die Darstellung des Dialogs funktioniert, nur wenn ich ihn nach Verwendung löschen möchte, stürzt meine Applikation ab. Lösche ich den FileChooser vom Dialog (nur noch ein OK-Button drauf) lässt sich der Dialog löschen.

Code: Alles auswählen

MyDialog* pD = new MyDialog( this, "dialog", true );
if ( pD->exec() == QDialog::Accepted ) {
 // ...
}
delete pD; // -> Crash
Den FileChooser habe ich aus dem Qt-Beispiel und ich verwende Qt 3.3.8.
Zuletzt geändert von Eddie am 24. Januar 2008 13:40, insgesamt 1-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Reproduzierbare Abstürze sind die einfachsten Fehler, die sich finden lassen wenn man einen Debugger einsetzt.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Eddie
Beiträge: 14
Registriert: 17. Juli 2007 19:36

Beitrag von Eddie »

Ich benutze einen Debugger (Visual Studio .NET). Und der springt in den Destruktur des im Designer erstellten Dialogs MyDialog. Daran kann ich aber nicht erkennen was da schief läuft.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Der Debugger von Visual Studio ist klasse. Du siehst doch genau wo der Fehler auftritt und kannst doch sehen, ob ein Pointer nicht initialisiert oder NULL ist.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann zeig uns mal etwas mehr code.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Eddie
Beiträge: 14
Registriert: 17. Juli 2007 19:36

Beitrag von Eddie »

OK, ich habe den Code des FileChooser und ein simplen Dialog als Beispiel angehängt. Hilft das?
Dateianhänge
example.zip
(2.68 KiB) 149-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

So auf die Schnelle fällt mir erstmal nichts auf - ausser dass Du Qt3 verwendest und ggf. ein dtor angebracht ist.
sStartWith und sFilter muss nicht initialisert werden - das geschieht automatisch.

Obwohl - laut Doku übernimmt bei QLayout::addItem() das layout die ownership, aber Du gibst FileChooser als parent an --> FileChooser versucht dann auch nocheinmal die children zu löschen. Kann ich aber nicht genau sagen ob das wirklich so ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Eddie
Beiträge: 14
Registriert: 17. Juli 2007 19:36

Beitrag von Eddie »

Ich habe testweise einen in der ui.h eine destroy-Funktion eingebaut. Darin sind beim Debuggen alle Zeiger definiert. Ein

Code: Alles auswählen

delete fileChooser2;
führt aber wiederum zum Absturz.

Das Ganze tritt im übrigen auch bei anderen Widgets auf, die sich in einem Plugin befinden. Muss man solche Widgets evtl. anders behandeln?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Hast Du meinen Post gelesen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Eddie
Beiträge: 14
Registriert: 17. Juli 2007 19:36

Beitrag von Eddie »

Christian81 hat geschrieben:Hast Du meinen Post gelesen?
Ja, und ich habe den "dtor" so verstanden, dass ich dem Dialog einen Destruktor spendieren soll und das habe ich mit der destroy-Funktionion probiert. Da habe ich dich scheinbar falsch verstanden. Soll der FileChooser einen Destruktor bekommen?

Das Layout legt der Designer ja selbst an. Da kann ich gar nicht eingreifen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

filechooser.cpp wurde vom designer erstellt??
Gib beim QLineEdit und QPushButton einfach mal keinen Parent an.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Christian81 hat geschrieben:Gib beim QLineEdit und QPushButton einfach mal keinen Parent an.
wuerde ich auch sagen, denn:
Trolltech-Doku hat geschrieben: Warning: All child objects are deleted. [...]
We do not recommend holding pointers to child objects from outside the parent. If you still do, the destroyed() signal gives you an opportunity to detect when an object is destroyed.
Entweder macht man die Verwaltung selbst (keine Parent-Pointer mit eigenem "delete"), oder man ueberlaesst es Qt (mit Parent-Pointer aber ohne "delete").
Eddie
Beiträge: 14
Registriert: 17. Juli 2007 19:36

Beitrag von Eddie »

Christian81 hat geschrieben:filechooser.cpp wurde vom designer erstellt??
Nein, den habe ich aus dem example-Verzeichnis von Qt und nur mit den beiden QStrings sStartWith und sFilter erweitert.
Christian81 hat geschrieben:Gib beim QLineEdit und QPushButton einfach mal keinen Parent an.
OK, ich habe folgendes versucht:

Code: Alles auswählen

lineEdit = new QLineEdit( NULL, "filechooser_lineedit" );
button = new QPushButton( "...", NULL, "filechooser_button" );
Das führt dazu, dass beide Elemente nicht dargestellt werden. Beim delete des Dialogs stürzt die Anwendung trotzdem ab.

Zudem tritt das Problem auch bei anderen Plugins auf! Alle sind nach dem Beispiel aus der Doku erstellt.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Unter welchem System bist Du überhaupt? Qas für eine Qt-Version? Da es Qt3 ist kann Dir wohl keiner (mehr) helfen - ist einfach zu alt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Eddie
Beiträge: 14
Registriert: 17. Juli 2007 19:36

Beitrag von Eddie »

Ich habe den Fehler nun entdeckt. Es lag an einem fehlenden #define in meinem Projekt, da ich folgendes in der FileChooser.h stehen habe:

Code: Alles auswählen

#ifdef MISC_WIDGETS_PLUGIN
	#include <qwidgetplugin.h> // Widget-Plugin
#else
	#undef QT_WIDGET_PLUGIN_EXPORT
	#define QT_WIDGET_PLUGIN_EXPORT
#endif
Sorry, für die Mühen, die ich gemacht habe.
Antworten