Frage zu Layout

Alles rund um die Programmierung mit Qt
Antworten
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Frage zu Layout

Beitrag von Flachkoepper »

Mahlzeit,

ich habe folgenden Programmteil:

in main.cpp:

Code: Alles auswählen

scrollArea = new QScrollArea;
plotArea = new PlotArea(scrollArea->viewport());
scrollArea->setWidget( plotArea );
scrollArea->setWidgetResizable( true );
Und die Implementierung der PlotArea:

Code: Alles auswählen

PlotArea::PlotArea( QWidget* parent) : QWidget( parent )
{
	layout = new QVBoxLayout(this);
}

void PlotArea::slotDisplay( QList<double*> dataList )
{
	for (int i = 1; i <= dataList.count(); i++) {
		plot = new QwtPlot;
		layout->addWidget( plot );
		plot->replot();
	}
}
Aus meinem Programm wird jetzt die Funktion slotDisplay() aufgerufen. Problem hierbei ist, dass bei zunehmender Größe der QList (in meinem Fall bei so ca. 30-40 ) der Aufbau des Layouts sehr lange ( mehrere Sekunden) dauert. Dies ist allerdings nicht der Fall, wenn ich die Funktion slotDisplay() im Konstruktor von PlotArea aufrufe.

Hat irgendwer ne Ahnung, wie ich das vielleicht beschleunigen kann?

Viele Grüße,
Flachkoepper.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wann wird SlotDisplay aufgerufen? Warum erstellst du da immer neue Widgets? Wann löscht du die wieder?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Guten Morgen,

1. slotDisplay wird aufgerufen bei folgendem Teil:

Code: Alles auswählen

connect(this, SIGNAL(dataLoaded(QList<double*>)), plotArea, SLOT(slotDisplay(QList<double*>)));
QStringList filenameList = QFileDialog::getOpenFileNames(...);
QList<double*> dataList = doSomething(filenameList); //Hier wird die Liste gefüllt
emti dataLoaded(dataList);
Dann soll 2. für jedes File aus filenameList ein eigenes PlotWidget erstellt werden und die Daten darin angezeigt werden. Das Löschen der Plotwidgets geschieht bei Ende des Programms (die brauche ich ja schließlich die ganze Zeit über.). Irgendwo ein Denkfehler dabei?

Viele Grüße,
Flachkoepper
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

slotDisplay hörte sich so an als würde es mehr als einmal aufgerufen, deshalb meine Frage. Ich denke es liegt evtl. daran, dass in jedem addWidget() das Layout neu berechnet werden muss (da das Layout schon angezeigt wird, was im Konstruktor noch nicht der Fall ist).
Ich würde mit QWidget::hide() bzw. show() experimentieren um den ständigen Neuaufbau zu vermeiden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Jau, wenn ich vor das emit dataLoaded() ein plotArea->hide() und danach sofort wieder ein plotArea->show() einfüge, dann geht der Bildschirmaufbau in Nullkommanix.

Danke!

Flachkoepper
Antworten