Speicherüberlauf durch zu viele Widgets?!

Alles rund um die Programmierung mit Qt
Antworten
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Speicherüberlauf durch zu viele Widgets?!

Beitrag von mephistho »

Hi,

ich komm nicht weiter...

Ich bin dabei mir ein Film-Verwaltungstool zu schreiben, welches seine Infos von imdb.com zieht.
Ich hab n Haufen Labels, LineEdits und TextEdits.
Ich definiere die alle fein in den Header-Files

Code: Alles auswählen

	QLineEdit *LESGenre;
Und erstelle sie in den cpps

Code: Alles auswählen

	LESGenre = new QLineEdit();
Ich habe verschiedene Ansichten für eine TabView. Z.B. eine für Filminfos, eine für ne programminterne Suche und eine fürs Hinzufügen eines Films. Wenn ich bei dieser letzten nun eine bestimmte Anzahl an LineEdits und Labels überschreite, schmiert mir das Tool direkt beim Start ab.

Ich hab keine Namen doppelt vergeben, keine Tippfehler (würd der Compiler ja eigentlich auch merken...), nix. ..
Irgendwelche Ideen? Ich hab hier doch nicht zu wenig Speicher dafür... Ist n HP Dualcore 2,GHZ mit 2GB RAM, Windows XP und Qt 4.4.0.
Die Auslagerungsdatei wird beim Start des Progs um 4MB größer, beim Ende bzw. Absturz wieder 4MB kleiner.

Ich raffs nicht...

Dank & Gruß
meph
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

Ohne code kann man da nichts sagen...
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Re: Speicherüberlauf durch zu viele Widgets?!

Beitrag von pfid »

mephistho hat geschrieben:

Code: Alles auswählen

	LESGenre = new QLineEdit();
Gibst du da auch das Parent Widget mit?
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Momentan nicht. Pflicht?
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

mephistho hat geschrieben:Momentan nicht. Pflicht?
Wenn du willst dass das Parent Widget beim Ableben auch das LineEdit löscht, ja. Wenn du alle Widgets manuell löschen willst, nein. Ausserdem werden ohne Parent Widget wohl einige Sachen nicht funktionieren.

http://doc.trolltech.com/4.4/qtextedit.html

Code: Alles auswählen

QTextEdit ( QWidget * parent = 0 )
QTextEdit ( const QString & text, QWidget * parent = 0 )
Das trifft auf so gut wie alle Widgets zu (Labels, Buttons, TextEdits).
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Jau... hab nu überall ein this mit drin. Gleicher Fehler.

Was mich auch verwirrt ist folgendes: Bei n Widgets (ich hab sie nicht genau gezählt, kann mir nicht vorstellen, dass das wirklich relevant ist) funktioniert das Tool. Bei n+3 ebenfalls noch. Bei n+4 dann auf einmal nicht mehr. Dann funktionieren auch n+1, n+2 und n+3 nicht mehr. Ich muss zu n zurück, kann dann wieder maximal drei zusätzliche hinzufügen und dann ist wieder Schluss...

:shock:
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann würde ich mal ein minimal reproduzierbares Beispiel zur Verfügung stellen...
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

kk, dann mal ein bisschen Code:

addsearch.h

Code: Alles auswählen

using namespace std;

class AddSearch: public QWidget
{
	Q_OBJECT
	
public:
	AddSearch(QWidget *parent = 0);	
	QString replaceUmlaute(QString);
	QString convertMonth(QString);
	
private:
	QLineEdit *LEMovieTitle;
	QLabel *LSTitle;
	QLabel *LSDirector;
	QLabel *LSGenre;
	QLabel *LSPlot;
	QLabel *LSTagline;
	QLabel *LSReleaseDate;
	QLabel *LSRuntime;
	QLabel *LSOwn;
	QLabel *LSRating;
	QLabel *LSCast;
	QLabel *LSNotes;
	
	QLineEdit *LESTitle;
	QLineEdit *LESDirector;
	QLineEdit *LESGenre;
//	QLineEdit *LESPlot;
//	QLineEdit *LESTagline;
//	QLineEdit *LESReleaseDate;
//	QLineEdit *LESRuntime;
//	QLineEdit *LESRating;
//	QComboBox *CBSOwn;
//	QTextEdit *TESCast;
//	QTextEdit *TESNotes;
//	QTextEdit *LWResults;
	QPushButton *PBSearch;
	QHttp *http;
	QFile *file;
    int httpGetId;
    bool httpRequestAborted;
	QString search;	

public slots:

[...]
addsearch.cpp

Code: Alles auswählen

AddSearch::AddSearch(QWidget *parent): QWidget(parent)
{
	QIcon *globalsearch = new QIcon("Data/Icons/GlobalSearch.gif");
//	this->setWindowIcon(*globalsearch);
//    setWindowTitle(tr("Add Movie"));
	QGridLayout *AddSearchMainGrid = new QGridLayout(this);
	
    LEMovieTitle = new QLineEdit("http://www.imdb.com/title/tt0418279/", this);
	AddSearchMainGrid->addWidget(LEMovieTitle, 0, 0, 1, 4);
	
	PBSearch = new QPushButton(*globalsearch, "", this);
	AddSearchMainGrid->addWidget(PBSearch, 0, 4, Qt::AlignTop);
	
	//LWResults = new QTextEdit(this);
	//AddSearchMainGrid->addWidget(LWResults, 1, 0, 4, 4);
	
	LSTitle = new QLabel("Title", this);
	LSDirector = new QLabel("Director", this);
	LSGenre = new QLabel("Genre", this);
	LSPlot = new QLabel("Plot", this);
	LSTagline = new QLabel("Tagline", this);
	LSReleaseDate = new QLabel("Release Date", this);
	LSRuntime = new QLabel("Runtime", this);
	LSOwn = new QLabel("Own", this);
	LSRating = new QLabel("Rating", this);
	LSCast = new QLabel("Cast", this);
	LSNotes = new QLabel("Notes", this);
	
	LESTitle = new QLineEdit(this);
	LESDirector = new QLineEdit(this);
	LESGenre = new QLineEdit(this);
//	LESPlot = new QLineEdit(this);
//	LESTagline = new QLineEdit(this);
//	LESReleaseDate = new QLineEdit(this);
//	LESRuntime = new QLineEdit(this);
//	CBSOwn = new QComboBox(this);
//	LESRating = new QLineEdit(this);
//	TESCast = new QTextEdit(this);
//	TESNotes = new QTextEdit(this);
	
	AddSearchMainGrid->addWidget(LSTitle, 1, 0);
	AddSearchMainGrid->addWidget(LESTitle, 1, 1);
	AddSearchMainGrid->addWidget(LSDirector, 2, 0);
	AddSearchMainGrid->addWidget(LESDirector, 2, 1);
	AddSearchMainGrid->addWidget(LSGenre, 3, 0);
	AddSearchMainGrid->addWidget(LESGenre, 3, 1);
	AddSearchMainGrid->addWidget(LSPlot, 4, 0);
//	AddSearchMainGrid->addWidget(LESPlot, 4, 1);
	AddSearchMainGrid->addWidget(LSTagline, 5, 0);
//	AddSearchMainGrid->addWidget(LESTagline, 5, 1);
	AddSearchMainGrid->addWidget(LSReleaseDate, 6, 0);
//	AddSearchMainGrid->addWidget(LESReleaseDate, 6, 1);
	AddSearchMainGrid->addWidget(LSRuntime, 7, 0);
//	AddSearchMainGrid->addWidget(LESRuntime, 7, 1);
	AddSearchMainGrid->addWidget(LSOwn, 8, 0);
//	AddSearchMainGrid->addWidget(CBSOwn, 8, 1);
	AddSearchMainGrid->addWidget(LSRating, 9, 0);
//	AddSearchMainGrid->addWidget(LESRating, 9, 1);
	AddSearchMainGrid->addWidget(LSCast, 10, 0);
//	AddSearchMainGrid->addWidget(TESCast, 10, 1, 3, 4);
	AddSearchMainGrid->addWidget(LSNotes, 13, 0);
//	AddSearchMainGrid->addWidget(TESNotes, 13, 1, 3, 4, Qt::AlignTop);
		
	setLayout(AddSearchMainGrid);
	
    http = new QHttp();

[...]
In diesem Zustand funtkioniert es.
Wenn ich jetzt maximal drei der auskommentierten LineEdits aktiviere und zum MainGrid hinzufüge, funktioniert es auch noch. Beim Vierten nicht mehr, dabei reicht es schon, wenn ichs im header aktiviere und auch egal welches. LESPlot oder LESReleaseDate... egal..

Danach muss ich dann alle vier wieder rausnehmen, neu kompilieren und kann wieder maximal drei hinzufügen.

AddSearch ist einer von drei Tabs. Anfangs hatte ich es als separates Fenster, aber das macht auch keinen Unterschied, der Fehler war derselbe.


Hilft das weiter? Welche Infos wären noch nützlich?

Dank & Gruß
meph
Antworten