auf öffentliche QList<QString> in anderer Klasse zugre

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Luna1987
Beiträge: 11
Registriert: 2. September 2009 14:34
Wohnort: Kassel

auf öffentliche QList<QString> in anderer Klasse zugre

Beitrag 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:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Luna1987
Beiträge: 11
Registriert: 2. September 2009 14:34
Wohnort: Kassel

Beitrag 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 ;-)
Antworten