Seite 1 von 1
[gelöst] QDialog mit FileChooser
Verfasst: 10. Januar 2008 19:39
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.
Verfasst: 11. Januar 2008 07:09
von macman
Reproduzierbare Abstürze sind die einfachsten Fehler, die sich finden lassen wenn man einen Debugger einsetzt.
Verfasst: 11. Januar 2008 09:12
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.
Verfasst: 11. Januar 2008 09:17
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.
Verfasst: 11. Januar 2008 09:44
von Christian81
Dann zeig uns mal etwas mehr code.
Verfasst: 11. Januar 2008 13:07
von Eddie
OK, ich habe den Code des FileChooser und ein simplen Dialog als Beispiel angehängt. Hilft das?
Verfasst: 11. Januar 2008 13:29
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.
Verfasst: 11. Januar 2008 15:37
von Eddie
Ich habe testweise einen in der ui.h eine destroy-Funktion eingebaut. Darin sind beim Debuggen alle Zeiger definiert. Ein
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?
Verfasst: 11. Januar 2008 16:18
von Christian81
Hast Du meinen Post gelesen?
Verfasst: 11. Januar 2008 17:04
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.
Verfasst: 11. Januar 2008 17:08
von Christian81
filechooser.cpp wurde vom designer erstellt??
Gib beim QLineEdit und QPushButton einfach mal keinen Parent an.
Verfasst: 11. Januar 2008 18:15
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").
Verfasst: 11. Januar 2008 18:58
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.
Verfasst: 12. Januar 2008 18:12
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.
Verfasst: 24. Januar 2008 13:40
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.