Seite 1 von 1

auf öffentliche QList<QString> in anderer Klasse zugre

Verfasst: 18. März 2011 11:49
von Luna1987
Hallo @ all :wink:

Ich arbeite mit Microsoft Visual Studio 2008, Qt und dem QtDesigner.
Ich habe ein QMainWindow (Klasse exporter.cpp) und einen QDialog (Klasse table.cpp).

Wenn ich in meinem QMainWindow auf einen Knopf „Tabelle“ klicke, dann öffnet sich der QDialog mit einer Tabelle, d.h bei Klick wird also in exporter.cpp die Methode „openQDialog“ aufgerufen. Diese ruft die Methode „fillTable“ in table.cpp und danach „show“ auf:

export.cpp:

Code: Alles auswählen

void Export::openQDialog()
{
table *newTable= new table (this);
newTable ->fillTable();	
newTable ->show();
}
Die Tabelle und ihre Werte werden auch problemlos angezeigt. Der Nutzer kann dann die Werte ändern und klickt dann auf einen Knopf „Speichern“. Dann werden in der Methode „saveTable“ die Werte der ersten Spalte in eine Liste namens „liste_name“ gespeichert und die Werte der zweiten Spalte in Liste „liste_type“ gespeichert:

table.cpp:

Code: Alles auswählen

void table::saveTable()
{
	// jede Zelle in eine Liste speichern
	for (int row = 0; row < ui.tableWidget_table->rowCount(); row++)
	{
		QTableWidgetItem *widgetItem1 = new QTableWidgetItem();
		widgetItem1 = ui.tableWidget_table->item(row, 0);


 QTableWidgetItem *widgetItem2 = new QTableWidgetItem();
		widgetItem2 = ui.tableWidget_table->item(row, 1);

		liste_name.append(widgetItem1->text());	
		liste_type.append(widgetItem2->text());	
}
}
Diese beiden Listen sind in table.h unter „public“ definiert:

table.h:

Code: Alles auswählen

public:
	table(QWidget *parent = 0, Qt::WFlags flags = 0);
	~table();
	QList<QString> liste_name;
	QList<QString> liste_type;
Dann schließt sich QDialog wieder und der Nutzer muss weitere Eingaben in dem QMainWindow machen...
Später brauche ich aber die in definierten Listen in export.cpp und will somit in der Methode "fillNewTable" auf die gefüllten Listen zugreifen:

export.cpp:

Code: Alles auswählen

...
table newtable;
QList<QString> liste_name_neu = newtable.liste_name;
QList<QString> liste_type_neu = newtable.liste_type;
PROBLEM: Beide Listen sind hier leer?! :? Habe beim Debuggen geguckt: In der Klasse table.cpp nach der Methode „saveTable“ sind beide gefüllt, in der Klasse export.cpp wird danach ne leere Liste übergeben?

Das ist sicherlich ein einfacher Fehler den ich da mache? Vielleicht könnt ihr helfen?!

DANKE :lol:

Verfasst: 18. März 2011 12:44
von franzf

Code: Alles auswählen

void Export::openQDialog()
{
table *newTable= new table (this); 
Das erstellt dir ein neues Objekt, dessen Sichtbarkeit mit Ende Der FUnktion endet, du kannst nicht mehr darauf zugreifen (Aus C++-Sicht, in Qt könntest du über objectName, findChild() etc. was drehen, ist aber nicht soooo 100% schön).
Lösung:
Brauchst du das Objekt in dieser Konfiguration öfters, bietet sich ein Member an:

Code: Alles auswählen

class Export:
    table *table_;
// usw.

Verfasst: 18. März 2011 12:47
von RHBaum
Naja, die intressanten code-Stellen in bezug auf den Fehler vorenthälst uns ja :-)

deswegen nur generell:
void Export::openQDialog()
{
table *newTable= new table (this);
newTable ->fillTable();
newTable ->show();
}
table *newTable= new table (this);

Vermeiden ! du erzeugst ne Tabelle aufn Heap , warum ???
Die daten der Tabelle liegen da sowieso ... warum die verwaltung aufn heap legen ?
Wenn LifeCycle ... warum dann die Tabelle in der Methode "openQDialog" erzeugen wollen ? Besser ne vorhandene Tabelle bearbeiten lassen ... per Referenz ?

New generell vermeiden ... und wenn, dann in verbindung mit nem Smartpointer verwenden.

Public members an Klassen sind auch eher ... unüblich.
setter und getter verwenden -> mehr controlle
und wenn ne Klasse/funktion auf die Member einer anderen Klasse zugreifen muss -> friend funktionalitaet nutzen.

Ansonsten kann ich dir ned helfen, zu wenig Infos, zu wirr ...
Denk aber du hasst impliziet mehr instanzen angelegt als vermutest, und deine befuellten Daten versauern irgendwo im Nirvana

Edit:
Wenn openQDialog wirklich so ist wie gepostet, dann siehe franzf's Post. Ich wollte einfach nur ned wahrhaben, das die methode da alles ist :-) Dachte eher dasn nur fragment :-)

Ciao ...

Verfasst: 21. März 2011 11:15
von Luna1987
Hy franzf und RHBaum.

Danke für eure Antworten!

@ franzf: Danke für den Tipp. Mit der Definition des Members läuft nun alles :-) Danke.

@RHBaum:
Naja, die intressanten code-Stellen in bezug auf den Fehler vorenthälst uns ja
Tue ich das? Natürlich habe ich nicht den GANZEN Code gepostet, da vieles dafür nicht relevant ist, aber ich habe keine weiteren Instanzen angelegt und euch vorenthalten ;-) !

Aber nun funktioniert es ja :-) Trotzdem danke ;-)