Qt4.1:probl. bei meinem projekt (daten v. class->class se

Alles rund um die Programmierung mit Qt
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Qt4.1:probl. bei meinem projekt (daten v. class->class se

Beitrag von slash-ex »

ich brauche etwas hilfe bei meinem projekt. es besteht aus einer klasse die eine tabelle zur rechten seite und tab-fenster zur linken zeichnet.
den inhalt der tabs stellt dann die andere klasse dar.
also: unit_type_HQ == Inhalt und MyBoardWDG == tabelle und tabs

so mein problem ist, das ich mich noch nicht so in der qt-programmieruung auskenne und auch in sachen oop nicht felsenfest bin... deshalb hab ich einige kleinere und größere schwierigkeiten.

zum beispiel will ich einige daten aus der klasse die den inhalt der tabs zeichnet in die tabelle der anderen klasse packen, das wären dann QStrings. die funktionen dafür habe ich schon gemacht. sind aber ungetestet und wie gesagt ich weiß nicht wie ich die daten übertragen soll. zuerst habe ich an vererbung gedacht, ich bekomm aber merkwürdige compilerfehler.
zudem habe ich an templates gedacht aber die werden nicht unterstützt.

dann hatte ich diverse probleme bei der vorwärts-deklaration von klassen und bei der projekt-unterteilung in mehrere dateien, ebenfalls mit compiler-fehler verbunden.

bevor ich jedoch meinen ziemlich unübersichtlichen code poste wollte ich mein primären problem ausführen.

in einer member-fkt. von der klasse die den tab-inhalt zeichnet will ich per

Code: Alles auswählen

QObject::connect(addUnit_But, SIGNAL(clicked() ), this, SLOT(start_classfkt() ) );
einen slot aufrufen

Code: Alles auswählen

void start_classfkt()
{
	QString UName = get_unit_name_combobox();
	QStringList equipment = get_EquipList();
	MyBoardWDG ::addToArmeeList(UName, equipment);/ PROBLEM
}
der eine member funktion von MyBoardWDG starten soll. diese soll dann gewissen inhalt in die tabelle packen.

so jetzt poste ich den gesamten code, falls jemand nicht weiß was ein entsprechender abschnitt macht, einfach mal posten.

Code: Alles auswählen

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <QtGui>
#include <iostream>
#include "text_reader.hpp"


enum armee_bereich  //für MyBoardWDG klasse
{
	HQ,
	Elite,
	Standard,
	Sturm,
	Unterstuetzung
};


class unit_type_HQ : public QWidget
{
	Q_OBJECT
private:
	int price;
	int mod_e_price;
	QStringList EquipList;

	QPushButton *addUnit_But;

	QComboBox *unit_name_combobox;
	QLabel *label_unit_name;
	QLabel *label_unit_pt;
	QTableWidget *unit_profile_table; //QGroupBox *horizontalGroupBox_profile;
	QListWidget *unit_equipment_list; //QGroupBox *verticalGroupBox_equip;
	QLabel *unit_price_label; //void setUnit_price_label();

	QStringList pre_conf_units;
	QStringList pre_conf_profile;
	QStringList pre_conf_equipment;
	static const int rows = 2, columns = 9;

public:
	QStringList get_EquipList() 
	{
		return EquipList;
	}
	QString get_unit_name_combobox() 
	{
		return unit_name_combobox->currentText();
	}

	unit_type_HQ(QWidget *parent = 0, QStringList units = 0, QStringList equipment = 0); // zeichnet den inhalt des tabs (darunterliegende fkt. eingeschlossen)

	virtual ~unit_type_HQ()
	{
	}

	QGroupBox *verticalGroupBox_equip;
	void createVerticalGroupBox_equip();  //teil des tabs der aurüstungsgegenstände auflistet

	QGroupBox *horizontalGroupBox_profile;
	void createHorizontalGroupBox_profile();  //teil des tabs der das profil darstellt

	void setProfileTable(QString);	//füllt die tabelle in horizontalGroupBox_profile mit profildaten; wird per slot (unten) aufgerufen)
	void setEquipList(QStringList);  //füllt liste in verticalGroupBox_equip mit ausrüstung; wird auch per slot aufgerufen

	static const int width = 350;  //breite von widgets im tab
	static const int height = 92;  //höhen von ...

public slots:
	void setUnitProfile(QString name) //füllt tabelle; connections im entspr. layout
	{
		QString str = read_profile("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", name);
		setProfileTable(str);
		std::cout<<"Profil gesetzt von "<<name.toStdString()<<" mit: "<<str.toStdString()<<std::endl;
	}

	void setUnitEquipment(QString name = "all") //füllt liste; connections im entspr. layout
	{
		name = name.section('\t', 0, 0);
		name = "#"+name+"#";
		QStringList str_lst = read_elist("equip.src", "/home/dgdaniel/develop/Qt/dgd/src/", name);
		setEquipList(str_lst);
	}

	void saveSelectedEquipment() //speichert ausgewählte ausrüstung in QStringList ;manipuliert auch den preis im bezug auf ausrüstung
	{
		EquipList.clear();	
		std::cout<<"Speichere Equipmentauswahl."<<std::endl;
		QList<QListWidgetItem*> selectedEquipItems;
		selectedEquipItems = unit_equipment_list->selectedItems();

		std::cout<<selectedEquipItems.size()<<" Items ausgewaehlt."<<std::endl;
		for(int i = 0; i < selectedEquipItems.size(); i++)
		{
			QListWidgetItem *item = selectedEquipItems.at(i);
			QString item_txt = item->text();
			std::cout<<"Speichere: "<<item_txt.toStdString()<<std::endl;
			EquipList.append(item_txt);
		}

		mod_e_price = price;
		mod_e_price += getPrice(0, EquipList, true);
		std::cout<<mod_e_price<<std::endl;
		unit_price_label->setText(QString::number(mod_e_price, 10) );
	}

	void setUnit_price(QString UName) // preis nur im bezug auf figur
	{
		price = getPrice(UName, EquipList, false);
		unit_price_label->setText(QString::number(price, 10) );
		std::cout<<price<<std::endl;
	}

	void start_classfkt()
	{
		QString UName = get_unit_name_combobox();
		QStringList equipment = get_EquipList();
		//addToArmeeList(UName, equipment);
	}
};


/*######################################################################################*/
unit_type_HQ::unit_type_HQ(QWidget *parent, QStringList units, QStringList equipment)
 : QWidget(parent), pre_conf_units(units), pre_conf_equipment(equipment)
{
	label_unit_name = new QLabel(tr("Name der Einheit:"));
	label_unit_pt = new QLabel(tr("Kosten:"));

	//einheit
	unit_name_combobox = new QComboBox(this);
	unit_name_combobox->addItems(pre_conf_units);

	//profil-tabelle
	unit_type_HQ::createHorizontalGroupBox_profile();
	//Ausrüstung
	unit_type_HQ::createVerticalGroupBox_equip();
	
	//Kosten
	unit_price_label = new QLabel();

	QVBoxLayout *mainLayout = new QVBoxLayout;
	mainLayout->addWidget(label_unit_name);
	mainLayout->addWidget(unit_name_combobox);

	mainLayout->addWidget(horizontalGroupBox_profile);
	mainLayout->addWidget(verticalGroupBox_equip);

	mainLayout->addWidget(label_unit_pt);
	mainLayout->addWidget(unit_price_label);

	setLayout(mainLayout);
}

/*######################################################################################*/
void unit_type_HQ::createHorizontalGroupBox_profile()
{
	horizontalGroupBox_profile = new QGroupBox(tr("Profil:") );
	QHBoxLayout *layout = new QHBoxLayout;

	unit_profile_table = new QTableWidget(rows, columns);
	unit_profile_table->setFixedSize(width, height);
	//Tabelle beschriften
	QTableWidgetItem *kg = new QTableWidgetItem("KG:");
	unit_profile_table->setItem(0, 0, kg);
	QTableWidgetItem *bf = new QTableWidgetItem("BF:");
	unit_profile_table->setItem(0, 1, bf);
	QTableWidgetItem *s = new QTableWidgetItem("S:");
	unit_profile_table->setItem(0, 2, s);
	QTableWidgetItem *w = new QTableWidgetItem("W:");
	unit_profile_table->setItem(0, 3, w);
	QTableWidgetItem *lp = new QTableWidgetItem("LP:");
	unit_profile_table->setItem(0, 4, lp);
	QTableWidgetItem *i = new QTableWidgetItem("I:");
	unit_profile_table->setItem(0, 5, i);
	QTableWidgetItem *a = new QTableWidgetItem("A:");
	unit_profile_table->setItem(0, 6, a);
	QTableWidgetItem *mw = new QTableWidgetItem("MW:");
	unit_profile_table->setItem(0, 7, mw);
	QTableWidgetItem *rw = new QTableWidgetItem("RW:");
	unit_profile_table->setItem(0, 8, rw);

	for(int i = 0; i < columns; i++)
	{
		unit_profile_table->resizeColumnToContents(i);
		if(unit_profile_table->columnWidth(i) < 36)
			unit_profile_table->setColumnWidth(i, 36);
	}

	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnitProfile(QString) ));
	//jetzt versuche ich den eingelesen Profilabschnitt zu zerlegen

	layout->addWidget(unit_profile_table);
	horizontalGroupBox_profile->setLayout(layout);
}

/*######################################################################################*/
void unit_type_HQ::setProfileTable(QString unit_profile)
{
	unit_profile.remove('[');
	unit_profile.remove(']');
	std::cout<<">> "<<unit_profile.toStdString()<<std::endl;
	//Tabelle mit profilwerten füllen
	QTableWidgetItem *kg_v = new QTableWidgetItem(unit_profile.section(',',0,0 ) );
	unit_profile_table->setItem(1, 0, kg_v);
	QTableWidgetItem *bf_v = new QTableWidgetItem(unit_profile.section(',',1,1 ) );
	unit_profile_table->setItem(1, 1, bf_v);
	QTableWidgetItem *s_v = new QTableWidgetItem(unit_profile.section(',',2,2 ) );
	unit_profile_table->setItem(1, 2, s_v);
	QTableWidgetItem *w_v = new QTableWidgetItem(unit_profile.section(',',3,3 ) );
	unit_profile_table->setItem(1, 3, w_v);
	QTableWidgetItem *lp_v = new QTableWidgetItem(unit_profile.section(',',4,4 ) );
	unit_profile_table->setItem(1, 4, lp_v);
	QTableWidgetItem *i_v = new QTableWidgetItem(unit_profile.section(',',5,5 ) );
	unit_profile_table->setItem(1, 5, i_v);
	QTableWidgetItem *a_v = new QTableWidgetItem(unit_profile.section(',',6,6 ) );
	unit_profile_table->setItem(1, 6, a_v);
	QTableWidgetItem *mw_v = new QTableWidgetItem(unit_profile.section(',',7,7 ) );
	unit_profile_table->setItem(1, 7, mw_v);
	QTableWidgetItem *rw_v = new QTableWidgetItem(unit_profile.section(',',8,8 ) );
	unit_profile_table->setItem(1, 8, rw_v);
}

/*######################################################################################*/
void unit_type_HQ::createVerticalGroupBox_equip()
{
	verticalGroupBox_equip = new QGroupBox(tr("Ausruestung:") );

	QVBoxLayout *layout = new QVBoxLayout;

	unit_equipment_list = new QListWidget();
	unit_equipment_list->setFixedSize(width, height);
	unit_equipment_list->setSelectionMode(QAbstractItemView::MultiSelection);

	addUnit_But = new QPushButton(tr("&Hinzufuegen") );
	addUnit_But->setFlat(true);

	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnitEquipment(QString) ) );
	QObject::connect(unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(saveSelectedEquipment() ) );
	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnit_price(QString) ) );
	QObject::connect(addUnit_But, SIGNAL(clicked() ), this, SLOT(start_classfkt() ) );

	layout->addWidget(unit_equipment_list);
	layout->addWidget(addUnit_But);
	verticalGroupBox_equip->setLayout(layout);
}

/*######################################################################################*/
void unit_type_HQ::setEquipList(QStringList list)
{
	unit_equipment_list->clear();
	unit_equipment_list->addItems(list);
	std::cout<<"Equipment gesetzt."<<std::endl;
}

/*######################################################################################*/
/*######################################################################################*/
/*######################################################################################*/

class MyBoardWDG : public QWidget//unit_type_HQ
{
	Q_OBJECT
private:
	QTableWidgetItem *itm_u;
	QTableWidgetItem *itm_e;

	int index_hq;
	int index_el;
	int index_sd;
	int index_st;
	int index_ap;

	QTabWidget *main_tab;
	QTableWidget *armee_list;

public:
	MyBoardWDG(QWidget *parent = 0);
	virtual ~MyBoardWDG()
	{
	}
	QVBoxLayout *armee_list_layout;  //layout für tabelle, wird in den konstruktor eingebaut
	void create_armee_list_layout();

	void addToArmee(QString unit, QString equip, armee_bereich area);  //Daten in Tabelle schreiben

	void addToArmeeList(QString UName, QStringList equipment) //ruft obere fkt. auf und verarbeitet ein paar daten
	{
		QString Unit;
		QString Equipment;

		Unit = UName.section("\t", 0, 0);
		for(int i = 0; i < equipment.size(); i++)
		{
			Equipment += (equipment.at(i) ).section("\t", 0, 0);
			if(i < equipment.size() - 1)
				Equipment += ", ";
		}

		addToArmee(Unit, Equipment, Standard);
	}
};

/*######################################################################################*/
MyBoardWDG::MyBoardWDG(QWidget *parent) : QWidget(parent)//unit_type_HQ(parent)
{
	index_hq = 2;
	index_el = 6;
	index_sd = 11;
	index_st = 19;
	index_ap = 23;

	QHBoxLayout *mainLayout = new QHBoxLayout(this);

	main_tab = new QTabWidget(this);
	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", hq)), tr("HQ"));
	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", elite)), tr("Elite"));
	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", sturm)), tr("Sturm"));
	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", standard)), tr("Standard"));
	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", approvement)), tr("Unterstuetzung"));
	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", transport)), tr("Transport"));
	main_tab->setFixedSize(400, 475);

	create_armee_list_layout();

	mainLayout->addWidget(main_tab);
	mainLayout->addLayout(armee_list_layout);
}

/*######################################################################################*/
void MyBoardWDG::create_armee_list_layout()
{
	armee_list_layout = new QVBoxLayout();

	armee_list = new QTableWidget(27, 4);
	armee_list->setColumnWidth(0, 90);
	armee_list->setColumnWidth(1, 30);
	armee_list->setColumnWidth(2, 440);
	armee_list->setColumnWidth(3, 34);

	for(int i = 0; i < 27; i++) armee_list->setRowHeight(i, 18);

	armee_list->setItem(0, 0, new QTableWidgetItem("Typ:"));
	armee_list->setItem(0, 1, new QTableWidgetItem("A:"));
	armee_list->setItem(0, 2, new QTableWidgetItem("Ausruestung:"));
	armee_list->setItem(0, 3, new QTableWidgetItem("Punkte:"));

	armee_list->setItem(1, 0, new QTableWidgetItem("HQ:"));
	armee_list->setItem(5, 0, new QTableWidgetItem("Elite:"));
	armee_list->setItem(10, 0, new QTableWidgetItem("Standard:"));
	armee_list->setItem(18, 0, new QTableWidgetItem("Sturm:"));
	armee_list->setItem(23, 0, new QTableWidgetItem("Unterstuetzung:"));

	armee_list_layout->addWidget(armee_list);
}

/*######################################################################################*/
void MyBoardWDG::addToArmee(QString unit, QString equip, armee_bereich area)
{
	itm_u = new QTableWidgetItem(unit);
	itm_e = new QTableWidgetItem(equip);

	if(area == HQ && index_hq < 5)
	{
		armee_list->setItem(index_hq, 0, itm_u);
		armee_list->setItem(index_hq, 2, itm_e);
		if(index_hq < 5)
			index_hq++;
	}
	if(area == Elite && index_el < 9)
	{
		armee_list->setItem(index_el, 0, itm_u);
		armee_list->setItem(index_el, 2, itm_e);
		if(index_el < 10)
			index_el++;
	}
	if(area == Standard && index_sd < 16)
	{
		armee_list->setItem(index_sd, 0, itm_u);
		armee_list->setItem(index_sd, 2, itm_e);
		if(index_sd < 18)
			index_sd++;
	}
	if(area == Sturm && index_st < 20)
	{
		armee_list->setItem(index_st, 0, itm_u);
		armee_list->setItem(index_st, 2, itm_e);
		if(index_st < 23)
			index_st++;
	}
	if(area == Unterstuetzung && index_ap < 24)
	{
		armee_list->setItem(index_ap, 0, itm_u);
		armee_list->setItem(index_ap, 2, itm_e);
		if(index_ap < 28)
			index_ap++;
	}
}

static const int width = 1065;
static const int height = 475;

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	MyBoardWDG widget;
	widget.resize(width, height);

	widget.show();
	return app.exec();
}

#include "dgd.moc"
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich verstehe dein Problem nicht ganz. Aber es wäre schon mal sinnvoll jeder Klasse eine eigene .h & .cpp-Datei zu spendieren. Was die Übersichtlichkeit erhöhen würde. Und wenn du dann noch Probleme mit Vorwärtsdeklarationen hast, dann kannst du ja mal einen Link auf dei Projektarchiv posten, damit man dir helfen kann.
monte
Beiträge: 24
Registriert: 28. August 2004 17:04
Wohnort: Wiswiel
Kontaktdaten:

Beitrag von monte »

Hm, das Problem könnt schon etwas detailierter beschrieben werden :) Ne compiler Meldung währe evtl. auch nicht schlech falls vorhanden.

Also du hast eine Klasse "unit_type_HQ" mit einem Slot "start_classfkt()" desweiteren hast du eine Klasse "MyBoardWDG" mit einer Funktion "addToArmeeList(QString UName, QStringList equipment)".

Wenn ich dich richtig verstanden habe möchtest du nun in dem Slot "start_classfkt()" die Funktion "addToArmeeList(QString UName, QStringList equipment)" aufrufen welche aber zu einem anderen Objekt gehört.

Dazu musst einen Pointer o.ä. auf das Objekt der Klasse "MyBoardWDG" haben

z.B

MyBoardWDG * m_Board = NULL
m_Board = GetBoard();
if( m_Board != NULL )
{
m_Board->addToArmeeList( UName, equipment );
}
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

also ich habe meine klasse/n etwas umgeschrieben, nun habe ich die sache nicht sehr elegant gelöst.

in unit_type_HQ(tab-inhalt)

Code: Alles auswählen

	QStringList *get_EquipList()
	{
		QStringList *adresse;
		adresse = &EquipList;
		return adresse;
	}
ihr könnt euch denken was folgt...
in der anderen klasse:

Code: Alles auswählen

	unit_type_HQ *HQ = new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", hq));
	main_tab->addTab(HQ, tr("HQ") );
...
	foo_HQ = HQ->get_EquipList();
also ich habe hier ein datentyp/objekt das auf die selbe adresse im speicher zeigt wie das objekt das ich haben will.
auf foo_HQ greif ich dann wiederum mittels member zu. ursprünglich habe ich ein sichere möglichkeit gesucht. mir scheint dieser weg ziemlich unsicher, ich kenne mich zwar nicht mit maschienensprache aus, aber sowas macht man doch nicht. oder?
naja egal. funktioniert erstmal...
zum nächsten problem. das aufspalten in mehere dateien habe ich auch schon probiert. ich bekomme nur haufenweise compilerfehler!
zum einen beschwert sich mein compiler über undefinierte referenzen. und vtables... naja ich kenn mich da nicht so aus... aber virtuelle funktionen habe ich nicht.

diese meldung bekomme ich wenn ich die klasse unit_type_HQ in eine datei packe:

Code: Alles auswählen

Linken der Datei ../bin/dgd (g++)
dgd.o: In function `unit_type_HQ':
/home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:108: undefined reference to `vtable for unit_type_HQ'
/home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:108: undefined reference to `vtable for unit_type_HQ'
/home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:108: undefined reference to `vtable for unit_type_HQ'
/home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:108: undefined reference to `vtable for unit_type_HQ'
dgd.o: In function `unit_type_HQ::tr(char const*, char const*)':
/home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:13: undefined reference to `unit_type_HQ::staticMetaObject'
dgd.o: In function `~unit_type_HQ':
/home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:45: undefined reference to `vtable for unit_type_HQ'
/home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:45: undefined reference to `vtable for unit_type_HQ'
collect2: ld returned 1 exit status
gmake[1]: *** [../bin/dgd] Fehler 1
gmake: *** [sub-src-make_default] Fehler 2
*** Beendet mit Status: 2 ***

meine dateien sehen jetzt so aus.

Code: Alles auswählen

#ifndef UNIT_TYPE_HPP

#define UNIT_TYPE_HPP

#include <QtGui>
#include <iostream>
#include "text_reader.hpp"

class unit_type_HQ : public QWidget
{
	friend class MyBoardWDG;

	Q_OBJECT
private:
	int price;
	int mod_e_price;
	QStringList EquipList;

	QPushButton *addUnit_But;

	QComboBox *unit_name_combobox;
	QLabel *label_unit_name;
	QLabel *label_unit_pt;
	QTableWidget *unit_profile_table; //QGroupBox *horizontalGroupBox_profile;
	QListWidget *unit_equipment_list; //QGroupBox *verticalGroupBox_equip;
	QLabel *unit_price_label; //void setUnit_price_label();

	QStringList pre_conf_units;
	QStringList pre_conf_profile;
	QStringList pre_conf_equipment;
	static const int rows = 2, columns = 9;

public:

	QStringList *get_EquipList()
	{
		QStringList *adresse;
		adresse = &EquipList;
		return adresse;
	}

	unit_type_HQ(QWidget *parent = 0, QStringList units = 0, QStringList equipment = 0); // zeichnet den inhalt des tabs (darunterliegende fkt. eingeschlossen)

	virtual ~unit_type_HQ()
	{
	}

	QGroupBox *verticalGroupBox_equip;
	void createVerticalGroupBox_equip();  //teil des tabs der aurüstungsgegenstände auflistet

	QGroupBox *horizontalGroupBox_profile;
	void createHorizontalGroupBox_profile();  //teil des tabs der das profil darstellt

	void setProfileTable(QString);	//füllt die tabelle in horizontalGroupBox_profile mit profildaten; wird per slot (unten) aufgerufen)
	void setEquipList(QStringList);  //füllt liste in verticalGroupBox_equip mit ausrüstung; wird auch per slot aufgerufen

	static const int width = 350;  //breite von widgets im tab
	static const int height = 92;  //höhen von ...

public slots:
	void setUnitProfile(QString name) //füllt tabelle; connections im entspr. layout
	{
		QString str = read_profile("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", name);
		setProfileTable(str);
		std::cout<<"Profil gesetzt von "<<name.toStdString()<<" mit: "<<str.toStdString()<<std::endl;
	}

	void setUnitEquipment(QString name = "all") //füllt liste; connections im entspr. layout
	{
		name = name.section('\t', 0, 0);
		name = "#"+name+"#";
		QStringList str_lst = read_elist("equip.src", "/home/dgdaniel/develop/Qt/dgd/src/", name);
		setEquipList(str_lst);
	}

	void saveSelectedEquipment() //speichert ausgewählte ausrüstung in QStringList ;manipuliert auch den preis im bezug auf ausrüstung
	{
		EquipList.clear();	
		std::cout<<"Speichere Equipmentauswahl."<<std::endl;
		QList<QListWidgetItem*> selectedEquipItems;
		selectedEquipItems = unit_equipment_list->selectedItems();

		std::cout<<selectedEquipItems.size()<<" Items ausgewaehlt."<<std::endl;
		for(int i = 0; i < selectedEquipItems.size(); i++)
		{
			QListWidgetItem *item = selectedEquipItems.at(i);
			QString item_txt = item->text();
			std::cout<<"Speichere: "<<item_txt.toStdString()<<std::endl;
			EquipList.append(item_txt);
		}

		mod_e_price = price;
		mod_e_price += getPrice(0, EquipList, true);
		std::cout<<mod_e_price<<std::endl;
		unit_price_label->setText(QString::number(mod_e_price, 10) );
	}

	void setUnit_price(QString UName) // preis nur im bezug auf figur
	{
		price = getPrice(UName, EquipList, false);
		unit_price_label->setText(QString::number(price, 10) );
		std::cout<<price<<std::endl;
	}
};

/*######################################################################################*/
unit_type_HQ::unit_type_HQ(QWidget *parent, QStringList units, QStringList equipment)
 : QWidget(parent), pre_conf_units(units), pre_conf_equipment(equipment)
{
	label_unit_name = new QLabel(tr("Name der Einheit:"));
	label_unit_pt = new QLabel(tr("Kosten:"));

	//einheit
	unit_name_combobox = new QComboBox(this);
	unit_name_combobox->addItems(pre_conf_units);

	//profil-tabelle
	unit_type_HQ::createHorizontalGroupBox_profile();
	//Ausrüstung
	unit_type_HQ::createVerticalGroupBox_equip();
	
	//Kosten
	unit_price_label = new QLabel();

	QVBoxLayout *mainLayout = new QVBoxLayout;
	mainLayout->addWidget(label_unit_name);
	mainLayout->addWidget(unit_name_combobox);

	mainLayout->addWidget(horizontalGroupBox_profile);
	mainLayout->addWidget(verticalGroupBox_equip);

	mainLayout->addWidget(label_unit_pt);
	mainLayout->addWidget(unit_price_label);

	setLayout(mainLayout);
}

/*######################################################################################*/
void unit_type_HQ::createHorizontalGroupBox_profile()
{
	horizontalGroupBox_profile = new QGroupBox(tr("Profil:") );
	QHBoxLayout *layout = new QHBoxLayout;

	unit_profile_table = new QTableWidget(rows, columns);
	unit_profile_table->setFixedSize(width, height);
	//Tabelle beschriften
	QTableWidgetItem *kg = new QTableWidgetItem("KG:");
	unit_profile_table->setItem(0, 0, kg);
	QTableWidgetItem *bf = new QTableWidgetItem("BF:");
	unit_profile_table->setItem(0, 1, bf);
	QTableWidgetItem *s = new QTableWidgetItem("S:");
	unit_profile_table->setItem(0, 2, s);
	QTableWidgetItem *w = new QTableWidgetItem("W:");
	unit_profile_table->setItem(0, 3, w);
	QTableWidgetItem *lp = new QTableWidgetItem("LP:");
	unit_profile_table->setItem(0, 4, lp);
	QTableWidgetItem *i = new QTableWidgetItem("I:");
	unit_profile_table->setItem(0, 5, i);
	QTableWidgetItem *a = new QTableWidgetItem("A:");
	unit_profile_table->setItem(0, 6, a);
	QTableWidgetItem *mw = new QTableWidgetItem("MW:");
	unit_profile_table->setItem(0, 7, mw);
	QTableWidgetItem *rw = new QTableWidgetItem("RW:");
	unit_profile_table->setItem(0, 8, rw);

	for(int i = 0; i < columns; i++)
	{
		unit_profile_table->resizeColumnToContents(i);
		if(unit_profile_table->columnWidth(i) < 36)
			unit_profile_table->setColumnWidth(i, 36);
	}

	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnitProfile(QString) ));
	//jetzt versuche ich den eingelesen Profilabschnitt zu zerlegen

	layout->addWidget(unit_profile_table);
	horizontalGroupBox_profile->setLayout(layout);
}

/*######################################################################################*/
void unit_type_HQ::setProfileTable(QString unit_profile)
{
	unit_profile.remove('[');
	unit_profile.remove(']');
	std::cout<<">> "<<unit_profile.toStdString()<<std::endl;
	//Tabelle mit profilwerten füllen
	QTableWidgetItem *kg_v = new QTableWidgetItem(unit_profile.section(',',0,0 ) );
	unit_profile_table->setItem(1, 0, kg_v);
	QTableWidgetItem *bf_v = new QTableWidgetItem(unit_profile.section(',',1,1 ) );
	unit_profile_table->setItem(1, 1, bf_v);
	QTableWidgetItem *s_v = new QTableWidgetItem(unit_profile.section(',',2,2 ) );
	unit_profile_table->setItem(1, 2, s_v);
	QTableWidgetItem *w_v = new QTableWidgetItem(unit_profile.section(',',3,3 ) );
	unit_profile_table->setItem(1, 3, w_v);
	QTableWidgetItem *lp_v = new QTableWidgetItem(unit_profile.section(',',4,4 ) );
	unit_profile_table->setItem(1, 4, lp_v);
	QTableWidgetItem *i_v = new QTableWidgetItem(unit_profile.section(',',5,5 ) );
	unit_profile_table->setItem(1, 5, i_v);
	QTableWidgetItem *a_v = new QTableWidgetItem(unit_profile.section(',',6,6 ) );
	unit_profile_table->setItem(1, 6, a_v);
	QTableWidgetItem *mw_v = new QTableWidgetItem(unit_profile.section(',',7,7 ) );
	unit_profile_table->setItem(1, 7, mw_v);
	QTableWidgetItem *rw_v = new QTableWidgetItem(unit_profile.section(',',8,8 ) );
	unit_profile_table->setItem(1, 8, rw_v);
}

/*######################################################################################*/
void unit_type_HQ::createVerticalGroupBox_equip()
{
	verticalGroupBox_equip = new QGroupBox(tr("Ausruestung:") );

	QVBoxLayout *layout = new QVBoxLayout;

	unit_equipment_list = new QListWidget();
	unit_equipment_list->setFixedSize(width, height);
	unit_equipment_list->setSelectionMode(QAbstractItemView::MultiSelection);

	addUnit_But = new QPushButton(tr("&Hinzufuegen") );
	addUnit_But->setFlat(true);

	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnitEquipment(QString) ) );
	QObject::connect(unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(saveSelectedEquipment() ) );
	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnit_price(QString) ) );

	layout->addWidget(unit_equipment_list);
	layout->addWidget(addUnit_But);
	verticalGroupBox_equip->setLayout(layout);
}

/*######################################################################################*/
void unit_type_HQ::setEquipList(QStringList list)
{
	unit_equipment_list->clear();
	unit_equipment_list->addItems(list);
	std::cout<<"Equipment gesetzt."<<std::endl;
}

//#include "moc_unit_type_HQ.cpp"
#endif

Code: Alles auswählen

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <QtGui>
#include <iostream>
#include "text_reader.hpp"
#include "unit_type_HQ.hpp"


enum armee_bereich  //für MyBoardWDG klasse
{
	HQ,
	Elite,
	Standard,
	Sturm,
	Unterstuetzung
};

/*######################################################################################*/
class MyBoardWDG : public QWidget//unit_type_HQ
{
	Q_OBJECT
private:
	QTableWidgetItem *itm_u;
	QTableWidgetItem *itm_e;

	int index_hq;
	int index_el;
	int index_sd;
	int index_st;
	int index_ap;

	QTabWidget *main_tab;
	QTableWidget *armee_list;

	QString UName_HQ;
	QString UName_EL;
	QString UName_ST;
	QString UName_SD;
	QString UName_AP;
	QString UName_TR;

	QStringList Equip_HQ;
	QStringList Equip_EL;
	QStringList Equip_ST;
	QStringList Equip_SD;
	QStringList Equip_AP;
	QStringList Equip_TR;

public:
	MyBoardWDG(QWidget *parent = 0);
	virtual ~MyBoardWDG()
	{
	}
	QVBoxLayout *armee_list_layout;  //layout für tabelle, wird in den konstruktor eingebaut
	void create_armee_list_layout();

	void addToArmee(QString unit, QString equip, armee_bereich area);  //Daten in Tabelle schreiben

	QStringList *foo_HQ;
	QStringList *foo_EL;
	QStringList *foo_ST;
	QStringList *foo_SD;
	QStringList *foo_AP;
	QStringList *foo_TR;

public slots:
	void setQString_HQ(QString T)
	{
		UName_HQ = T;
		std::cout<<"String: "<< UName_HQ.toStdString() << " gespeichert."<<std::endl;
	}
	void setQString_EL(QString T)
	{
		UName_EL = T;
		std::cout<<"String: "<< UName_HQ.toStdString() << " gespeichert."<<std::endl;
	}
	void setQString_ST(QString T)
	{
		UName_ST = T;
		std::cout<<"String: "<< UName_HQ.toStdString() << " gespeichert."<<std::endl;
	}
	void setQString_SD(QString T)
	{
		UName_SD = T;
		std::cout<<"String: "<< UName_HQ.toStdString() << " gespeichert."<<std::endl;
	}
	void setQString_AP(QString T)
	{
		UName_AP = T;
		std::cout<<"String: "<< UName_HQ.toStdString() << " gespeichert."<<std::endl;
	}

	void addToArmeeList_HQ()
	{
		QString Unit;
		QString Equipment;
		QString UName = UName_HQ;
		QStringList equipment = Equip_HQ;

		Unit = UName.section("\t", 0, 0);
		for(int i = 0; i < equipment.size(); i++)
		{
			Equipment += (equipment.at(i) ).section("\t", 0, 0);
			if(i < equipment.size() - 1)
				Equipment += ", ";
		}
		std::cout<<"zur Liste hinzugefuegt."<<std::endl;
		addToArmee(Unit, Equipment, HQ);
	}
	void addToArmeeList_EL()
	{
		QString Unit;
		QString Equipment;
		QString UName = UName_EL;
		QStringList equipment = Equip_EL;

		Unit = UName.section("\t", 0, 0);
		for(int i = 0; i < equipment.size(); i++)
		{
			Equipment += (equipment.at(i) ).section("\t", 0, 0);
			if(i < equipment.size() - 1)
				Equipment += ", ";
		}
		std::cout<<"zur Liste hinzugefuegt."<<std::endl;
		addToArmee(Unit, Equipment, Elite);
	}
	void addToArmeeList_ST()
	{
		QString Unit;
		QString Equipment;
		QString UName = UName_ST;
		QStringList equipment = Equip_ST;

		Unit = UName.section("\t", 0, 0);
		for(int i = 0; i < equipment.size(); i++)
		{
			Equipment += (equipment.at(i) ).section("\t", 0, 0);
			if(i < equipment.size() - 1)
				Equipment += ", ";
		}
		std::cout<<"zur Liste hinzugefuegt."<<std::endl;
		addToArmee(Unit, Equipment, Sturm);
	}
	void addToArmeeList_SD()
	{
		QString Unit;
		QString Equipment;
		QString UName = UName_SD;
		QStringList equipment = Equip_SD;

		Unit = UName.section("\t", 0, 0);
		for(int i = 0; i < equipment.size(); i++)
		{
			Equipment += (equipment.at(i) ).section("\t", 0, 0);
			if(i < equipment.size() - 1)
				Equipment += ", ";
		}
		std::cout<<"zur Liste hinzugefuegt."<<std::endl;
		addToArmee(Unit, Equipment, Standard);
	}
	void addToArmeeList_AP()
	{
		QString Unit;
		QString Equipment;
		QString UName = UName_AP;
		QStringList equipment = Equip_AP;

		Unit = UName.section("\t", 0, 0);
		for(int i = 0; i < equipment.size(); i++)
		{
			Equipment += (equipment.at(i) ).section("\t", 0, 0);
			if(i < equipment.size() - 1)
				Equipment += ", ";
		}
		std::cout<<"zur Liste hinzugefuegt."<<std::endl;
		addToArmee(Unit, Equipment, Unterstuetzung);
	}

	void setEquip_HQ(){Equip_HQ = *foo_HQ; //ganz gefährliches konstrukt!!!!
	}
	void setEquip_EL(){Equip_EL = *foo_EL; //ganz gefährliches konstrukt!!!!
	}
	void setEquip_ST(){Equip_ST = *foo_ST; //ganz gefährliches konstrukt!!!!
	}
	void setEquip_SD(){Equip_SD = *foo_SD; //ganz gefährliches konstrukt!!!!
	}
	void setEquip_AP(){Equip_AP = *foo_AP; //ganz gefährliches konstrukt!!!!
	}
};

/*######################################################################################*/
MyBoardWDG::MyBoardWDG(QWidget *parent) : QWidget(parent)//unit_type_HQ(parent)
{
	index_hq = 2;
	index_el = 6;
	index_sd = 11;
	index_st = 19;
	index_ap = 23;

	QHBoxLayout *mainLayout = new QHBoxLayout(this);

	main_tab = new QTabWidget(this);

	unit_type_HQ *HQ = new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", hq));
	main_tab->addTab(HQ, tr("HQ") );
	QObject::connect(HQ->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setQString_HQ(QString) ));
	QObject::connect(HQ->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_HQ() ));
	QObject::connect(HQ->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_HQ() ) );
	foo_HQ = HQ->get_EquipList();

	unit_type_HQ *EL = new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", elite));
	main_tab->addTab(EL, tr("Elite"));
	QObject::connect(EL->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setQString_EL(QString) ));
	QObject::connect(EL->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_EL() ));
	QObject::connect(EL->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_EL() ) );
	foo_EL = EL->get_EquipList();

	unit_type_HQ *ST = new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", sturm));
	main_tab->addTab(ST, tr("Sturm"));
	QObject::connect(ST->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setQString_ST(QString) ));
	QObject::connect(ST->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_ST() ));
	QObject::connect(ST->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_ST() ) );
	foo_ST = ST->get_EquipList();

	unit_type_HQ *SD = new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", standard));
	main_tab->addTab(SD, tr("Standard"));
	QObject::connect(SD->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setQString_SD(QString) ));
	QObject::connect(SD->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_SD() ));
	QObject::connect(SD->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_SD() ) );
	foo_SD = SD->get_EquipList();

	unit_type_HQ *AP = new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", approvement));
	main_tab->addTab(AP, tr("Unterstuetzung"));
	QObject::connect(AP->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setQString_AP(QString) ));
	QObject::connect(AP->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_AP() ));
	QObject::connect(AP->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_AP() ) );
	foo_AP = AP->get_EquipList();

	unit_type_HQ *TR = new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", transport));
	main_tab->addTab(TR, tr("Transport"));

	main_tab->setFixedSize(400, 475);

	create_armee_list_layout();

	mainLayout->addWidget(main_tab);
	mainLayout->addLayout(armee_list_layout);
}

/*######################################################################################*/
void MyBoardWDG::create_armee_list_layout()
{
	armee_list_layout = new QVBoxLayout();

	armee_list = new QTableWidget(27, 4);
	armee_list->setColumnWidth(0, 90);
	armee_list->setColumnWidth(1, 30);
	armee_list->setColumnWidth(2, 440);
	armee_list->setColumnWidth(3, 34);

	for(int i = 0; i < 27; i++) armee_list->setRowHeight(i, 18);

	armee_list->setItem(0, 0, new QTableWidgetItem("Typ:"));
	armee_list->setItem(0, 1, new QTableWidgetItem("A:"));
	armee_list->setItem(0, 2, new QTableWidgetItem("Ausruestung:"));
	armee_list->setItem(0, 3, new QTableWidgetItem("Punkte:"));

	armee_list->setItem(1, 0, new QTableWidgetItem("HQ:"));
	armee_list->setItem(5, 0, new QTableWidgetItem("Elite:"));
	armee_list->setItem(10, 0, new QTableWidgetItem("Standard:"));
	armee_list->setItem(18, 0, new QTableWidgetItem("Sturm:"));
	armee_list->setItem(23, 0, new QTableWidgetItem("Unterstuetzung:"));

	armee_list_layout->addWidget(armee_list);
}

/*######################################################################################*/
void MyBoardWDG::addToArmee(QString unit, QString equip, armee_bereich area)
{
	itm_u = new QTableWidgetItem(unit);
	itm_e = new QTableWidgetItem(equip);

	if(area == HQ && index_hq < 5)
	{
		armee_list->setItem(index_hq, 0, itm_u);
		armee_list->setItem(index_hq, 2, itm_e);
		if(index_hq < 5)
			index_hq++;
	}
	if(area == Elite && index_el < 9)
	{
		armee_list->setItem(index_el, 0, itm_u);
		armee_list->setItem(index_el, 2, itm_e);
		if(index_el < 10)
			index_el++;
	}
	if(area == Standard && index_sd < 16)
	{
		armee_list->setItem(index_sd, 0, itm_u);
		armee_list->setItem(index_sd, 2, itm_e);
		if(index_sd < 18)
			index_sd++;
	}
	if(area == Sturm && index_st < 20)
	{
		armee_list->setItem(index_st, 0, itm_u);
		armee_list->setItem(index_st, 2, itm_e);
		if(index_st < 23)
			index_st++;
	}
	if(area == Unterstuetzung && index_ap < 24)
	{
		armee_list->setItem(index_ap, 0, itm_u);
		armee_list->setItem(index_ap, 2, itm_e);
		if(index_ap < 28)
			index_ap++;
	}
}

static const int width = 1065;
static const int height = 475;

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	MyBoardWDG widget;
	widget.resize(width, height);

	unit_type_HQ test;
	
	//std::cout<<"main: "<<test.get_unit_name_combobox().toStdString()<<std::endl;

	widget.show();
	return app.exec();
}

#include "dgd.moc"
also ich weiß übrigens nicht so recht wann ich diese moc-dateien einbinden muss. könnte mir das mal einer erklären?
dann würde ich gerne wissen wie ich die doofen klassen aufteilen kann ohne fehler zu kassieren.

zuletzt hab ich ne frage wie ich MyBoardWDG von unit_type_HQ:: erben lassen kann. da bekomm ich auch probleme könnte das mal einer posten. vielleicht in einer freien minute... :oops: [/code]
Antworten