undefinierte referenz auf destruktor?! weiß nicht so ganz...

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

undefinierte referenz auf destruktor?! weiß nicht so ganz...

Beitrag von slash-ex »

ich habe mein projekt endlich auf mehrere dateien verteilt, aber ich bekomme einen merkwürdigen fehler und weiß irgendwie keine lösung. da der fehler nur auf eine klasse eingeht poste ich mal den code. ich hoffe jemand könnte helfen.

FEHLER:

Code: Alles auswählen

/home/daniel/qt/wh40k/src/main.cpp:20: undefined reference to `MyBoardWDG::MyBoardWDG(QWidget*)'
/home/daniel/qt/wh40k/src/main.cpp:25: undefined reference to `MyBoardWDG::~MyBoardWDG()'
/home/daniel/qt/wh40k/src/main.cpp:25: undefined reference to `MyBoardWDG::~MyBoardWDG()'
collect2: ld gab 1 als Ende-Status zurück
make: *** [../bin/wh40k] Fehler 1
MAIN:

Code: Alles auswählen

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

#include <QtGui>

#include <iostream>
#include "txt_parse.hpp"
#include "menu_fkts.hpp"

#include "MyBoardWDG.h"
#include "Unit_Interface.h"

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();
}
KLASSE: MyBoardWDG (MyBoardWDG.h)

Code: Alles auswählen

#ifndef MYBOARDWIDGET_H
#define MYBOARDWIDGET_H

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

#include <QtGui>

#include <iostream>
#include "txt_parse.hpp"
#include "menu_fkts.hpp"


extern const QString quell_pfad_units = "/home/daniel/qt/wh40k/bin/";
extern const QString quell_pfad_equip = "/home/daniel/qt/wh40k/bin/";

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

class MyBoardWDG : public QWidget
{
	Q_OBJECT
private:
	QFileDialog *s_filedial;
	QFileDialog *o_filedial;

	QPrinter *print_me;

	QHBoxLayout *mainLayout;
	QVBoxLayout *VBox_menu;

	QMenuBar *filebar;
	QMenu *file;
	QMenu *data;
	QMenu *help;

	QTableWidgetItem *itm_u;
	QTableWidgetItem *itm_e;
	QTableWidgetItem *itm_p;

	int row_sel;

	QTabWidget *main_tab;
	QTableWidget *armee_list;

	QString unit_name;

public:
	void create_QHBoxLayout_menu();

	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, int price, armee_bereich area);  //Daten in Tabelle schreiben

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

	int UPrice;
	int *U_gPrice;
	int *U_mPrice;

public slots:
	//Menübar
	void s_list();
	void o_list();
	void print_list();

	void setUName(QString T);

	void addToArmeeList_HQ();

	void addToArmeeList_EL();

	void addToArmeeList_ST();

	void addToArmeeList_SD();

	void addToArmeeList_AP();

	void price_multiplier(int row, int column);

	void setEquip_HQ();
	void setEquip_EL();
	void setEquip_ST();
	void setEquip_SD(); 
	void setEquip_AP(); 

	void setmPrice(); //hat noch fehler

	void delete_row();

	void set_row(int row, int column);
};

#endif
IMPLEMENTATION

Code: Alles auswählen

#include "MyBoardWDG.h"

MyBoardWDG::~MyBoardWDG()
{
}

void MyBoardWDG::setUName(QString T)
{
	unit_name = T;
	//UPrice = *U_gPrice;
	//if(*U_mPrice < 50)
		//UPrice = *U_gPrice + (*U_mPrice - *U_gPrice);
	std::cout<<"String: "<< unit_name.toStdString() << " gespeichert."<<std::endl;
}

void MyBoardWDG::addToArmeeList_HQ()
{
	QString Unit;
	QString Equip_List;
	int Price;
	QString UName = unit_name;

	Unit = UName.section("\t", 0, 0);

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

	Price = UPrice;

	std::cout<<"zur Liste hinzugefuegt."<<std::endl;
	addToArmee(Unit, Equip_List, Price, HQ);
}

void MyBoardWDG::addToArmeeList_EL()
{
	QString Unit;
	QString Equip_List;
	int Price;
	QString UName = unit_name;
	QStringList equipment = equip;

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

	Price = UPrice;

	std::cout<<"zur Liste hinzugefuegt."<<std::endl;
	addToArmee(Unit, Equip_List, Price, Elite);
}

void MyBoardWDG::addToArmeeList_ST()
{
	QString Unit;
	QString Equip_List;
	int Price;
	QString UName = unit_name;
	QStringList equipment = equip;

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

	Price = UPrice;

	std::cout<<"zur Liste hinzugefuegt."<<std::endl;
	addToArmee(Unit, Equip_List, Price, Sturm);
}

void MyBoardWDG::addToArmeeList_SD()
{
	QString Unit;
	QString Equip_List;
	int Price;
	QString UName = unit_name;
	QStringList equipment = equip;

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

	Price = UPrice;

	std::cout<<"zur Liste hinzugefuegt."<<std::endl;
	addToArmee(Unit, Equip_List, Price, Standard);
}

void MyBoardWDG::addToArmeeList_AP()
{
	QString Unit;
	QString Equip_List;
	int Price;
	QString UName = unit_name;
	QStringList equipment = equip;

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

	Price = UPrice;

	std::cout<<"zur Liste hinzugefuegt."<<std::endl;
	addToArmee(Unit, Equip_List, Price, Unterstuetzung);
}

void MyBoardWDG::price_multiplier(int row, int column)
{
	std::cout<<"Daten in Zelle: "<<row<<":"<<column<<" veraendert."<<std::endl;
	row_sel = row;

	int multi_kosten;
	int einzel_preis;
	int gruppenpreis;

	if(column == 1)
	{
		std::cout<<"==>Berechne Preis neu."<<std::endl;
		QTableWidgetItem *anzahl_item = new QTableWidgetItem();

		anzahl_item = armee_list->item(row, column);

		int anzahl = (anzahl_item->text() ).toInt(NULL, 10);

		multi_kosten = anzahl * UPrice;
		QString m_k;
		QTableWidgetItem *multi_preis_item = new QTableWidgetItem();
		multi_preis_item->setText(m_k.setNum(multi_kosten, 10) );

		armee_list->setItem(row, 3, multi_preis_item);
	}
}

void MyBoardWDG::setEquip_HQ() {equip = *foo_HQ;} //ganz gefährliches konstrukt!!!!
void MyBoardWDG::setEquip_EL() {equip = *foo_EL;} 
void MyBoardWDG::setEquip_ST() {equip = *foo_ST;} 
void MyBoardWDG::setEquip_SD() {equip = *foo_SD;} 
void MyBoardWDG::setEquip_AP() {equip = *foo_AP;} 
void MyBoardWDG::setmPrice() //hat noch fehler

{
	UPrice = *U_mPrice;
	std::cout<<"Gesamtpreis ist: "<<UPrice<<std::endl;
}

void MyBoardWDG::delete_row()
{
	QTableWidgetItem *itm = new QTableWidgetItem();
	itm->setText("");

	std::cout<<"Loesche Zeile "<<row_sel<<std::endl;
	armee_list->setItem(row_sel, 0, itm);
	armee_list->setItem(row_sel, 1, itm);
	armee_list->setItem(row_sel, 2, itm);
	armee_list->setItem(row_sel, 3, itm);
}

void MyBoardWDG::set_row(int row, int column)
{
	row_sel = row;
}

/*######################################################################################*/
void MyBoardWDG::s_list()
{
	QString f_name;
	f_name = s_filedial->getSaveFileName();

	QDir dir = s_filedial->directory();
	QString str_dir = dir.path();

	save_data(str_dir, f_name, armee_list, 28, 4);
}

/*######################################################################################*/
void MyBoardWDG::o_list()
{
	QString f_name;
	f_name = o_filedial->getOpenFileName();

	QDir dir = o_filedial->directory();
	QString str_dir = dir.path();

	open_data(str_dir, f_name, armee_list);
}
/*######################################################################################*/

void MyBoardWDG::print_list()
{
	
}
/*######################################################################################*/

MyBoardWDG::MyBoardWDG(QWidget *parent) : QWidget(parent)
{
	VBox_menu = new QVBoxLayout(this);

	filebar = new QMenuBar(this);
	file = new QMenu(tr("&Datei"), filebar);
	data = new QMenu(tr("&Bearbeiten"), filebar);
	help = new QMenu(tr("&Hilfe"), filebar);
	filebar->addMenu(file);
	filebar->addMenu(data);
	filebar->addMenu(help);

	VBox_menu->addWidget(filebar);

	create_QHBoxLayout_menu();

	VBox_menu->addWidget(filebar);
	VBox_menu->addLayout(mainLayout);

	//Öffnen/Speichern
	s_filedial = new QFileDialog(this);
	s_filedial->setAcceptMode(QFileDialog::AcceptSave);
	s_filedial->setFilter( "Text (*.wh40k)" );

	file->addAction(tr("&Speichern"), this, SLOT(s_list() ) );

	o_filedial = new QFileDialog(this, tr("Öffnen"));
	o_filedial->setAcceptMode(QFileDialog::AcceptOpen);
	o_filedial->setFilter( "Text (*.wh40k)" );

	file->addAction(tr("&Öffnen"), this, SLOT(o_list() ) );

	//drucken
	print_me = new QPrinter(QPrinter::HighResolution);
	print_me->setOrientation(QPrinter::Landscape);
	print_me->setPageSize(QPrinter::A4);
	print_me->setFullPage(true);
	print_me->setNumCopies(1);

	file->addAction(tr("&Drucken"), this, SLOT(print_list() ) );
}

/*######################################################################################*/
void MyBoardWDG::create_QHBoxLayout_menu()
{
	mainLayout = new QHBoxLayout(this);

	main_tab = new QTabWidget(this);

	unit_interface *HQ = new unit_interface(0, read_plist("units.src", quell_pfad_units, hq));
	main_tab->addTab(HQ, tr("HQ") );
	QObject::connect(HQ->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
	QObject::connect(HQ->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_HQ() ));
	QObject::connect(HQ->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_HQ() ) ); 
	QObject::connect(HQ->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
	foo_HQ = HQ->get_EquipList(); //foo_* übergeben... 
	U_mPrice = HQ->get_mPrice();

	unit_interface *EL = new unit_interface(0, read_plist("units.src", quell_pfad_units, elite));
	main_tab->addTab(EL, tr("Elite"));
	QObject::connect(EL->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
	QObject::connect(EL->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_EL() ));
	QObject::connect(EL->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_EL() ) );
	QObject::connect(EL->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
	foo_EL = EL->get_EquipList();
	U_mPrice = HQ->get_mPrice();

	unit_interface *ST = new unit_interface(0, read_plist("units.src", quell_pfad_units, sturm));
	main_tab->addTab(ST, tr("Sturm"));
	QObject::connect(ST->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
	QObject::connect(ST->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_ST() ));
	QObject::connect(ST->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_ST() ) );
	QObject::connect(ST->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
	foo_ST = ST->get_EquipList();
	U_mPrice = HQ->get_mPrice();

	unit_interface *SD = new unit_interface(0, read_plist("units.src", quell_pfad_units, standard));
	main_tab->addTab(SD, tr("Standard"));
	QObject::connect(SD->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
	QObject::connect(SD->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_SD() ));
	QObject::connect(SD->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_SD() ) );
	QObject::connect(SD->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
	foo_SD = SD->get_EquipList();
	U_mPrice = HQ->get_mPrice();

	unit_interface *AP = new unit_interface(0, read_plist("units.src", quell_pfad_units, approvement));
	main_tab->addTab(AP, tr("Unterstuetzung"));
	QObject::connect(AP->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
	QObject::connect(AP->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_AP() ));
	QObject::connect(AP->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_AP() ) );
	QObject::connect(AP->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
	foo_AP = AP->get_EquipList();
	U_mPrice = HQ->get_mPrice();

	unit_interface *TR = new unit_interface(0, read_plist("units.src", quell_pfad_units, transport));
	main_tab->addTab(TR, tr("Transport"));

	main_tab->setFixedSize(400, 475);

	create_armee_list_layout();
	QObject::connect(armee_list, SIGNAL(cellChanged(int, int)), this, SLOT(price_multiplier(int, int)));
	//aktuelle Zeile benutzen um einheiten in die armeeliste einzufügen (siehe addToArmee)
	QObject::connect(armee_list, SIGNAL(cellClicked(int, int)), this, SLOT(set_row(int, int)));

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

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

	armee_list = new QTableWidget(28, 4);
	armee_list->setColumnWidth(0, 90);
	armee_list->setColumnWidth(1, 30);
	armee_list->setColumnWidth(2, 400);
	armee_list->setColumnWidth(3, 50);

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

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

	armee_list->setItem(1, 0, new QTableWidgetItem(tr("HQ:")));
	armee_list->setItem(6, 0, new QTableWidgetItem(tr("Elite:")));
	armee_list->setItem(11, 0, new QTableWidgetItem(tr("Standard:")));
	armee_list->setItem(19, 0, new QTableWidgetItem(tr("Sturm:")));
	armee_list->setItem(24, 0, new QTableWidgetItem(tr("Unterstuetzung:")));

	QPushButton *del_Butt = new QPushButton("Lösche Zeile", this);
	del_Butt->setFlat(true);
	QObject::connect(del_Butt, SIGNAL(pressed() ), this, SLOT(delete_row() ) );

	armee_list_layout->addWidget(armee_list);
	armee_list_layout->addWidget(del_Butt);
}

/*######################################################################################*/
void MyBoardWDG::addToArmee(QString unit, QString equip, int price, armee_bereich area)
{
	QString str_price = QString::number(price);

	itm_u = new QTableWidgetItem(unit);
	itm_e = new QTableWidgetItem(equip);
	itm_p = new QTableWidgetItem(str_price);

	std::cout<<"Markierte Zeile: "<<row_sel<<std::endl;
	if(area == HQ && row_sel < 5)
	{
		armee_list->setItem(row_sel, 0, itm_u);
		armee_list->setItem(row_sel, 2, itm_e);
		armee_list->setItem(row_sel, 3, itm_p);
	}
	if(area == Elite && row_sel < 10 && row_sel >= 7)
	{
		armee_list->setItem(row_sel, 0, itm_u);
		armee_list->setItem(row_sel, 2, itm_e);
		armee_list->setItem(row_sel, 3, itm_p);
	}
	if(area == Standard && row_sel < 18 && row_sel >= 12)
	{
		armee_list->setItem(row_sel, 0, itm_u);
		armee_list->setItem(row_sel, 2, itm_e);
		armee_list->setItem(row_sel, 3, itm_p);
	}
	if(area == Sturm && row_sel < 23 && row_sel >= 20)
	{
		armee_list->setItem(row_sel, 0, itm_u);
		armee_list->setItem(row_sel, 2, itm_e);
		armee_list->setItem(row_sel, 3, itm_p);
	}
	if(area == Unterstuetzung && row_sel < 29 && row_sel >= 25)
	{
		armee_list->setItem(row_sel, 0, itm_u);
		armee_list->setItem(row_sel, 2, itm_e);
		armee_list->setItem(row_sel, 3, itm_p);
	}
} 

#include "MyBoardWDG.moc" 
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

mmh, das lag wohl an meiner *pro datei! nun bekomme ich aber solche fehler:

Code: Alles auswählen

xt_parse.hpp:22: Fehler: »QStringList« bezeichnet keinen Typ
txt_parse.hpp:73: Fehler: »QStringList« bezeichnet keinen Typ
txt_parse.hpp:113: Fehler: »QString« bezeichnet keinen Typ
txt_parse.hpp:147: Fehler: »QStringList« bezeichnet keinen Typ
txt_parse.hpp:182: Fehler: »QString« wurde in diesem Gültigkeitsbereich nicht definiert
txt_parse.hpp:182: Fehler: »QStringList« wurde in diesem Gültigkeitsbereich nicht definiert
txt_parse.hpp:182: Fehler: expected primary-expression vor "bool"
txt_parse.hpp:183: Fehler: initializer Ausdrucksliste als zusammengesetzten Ausdruck behandelt
txt_parse.hpp:183: Fehler: expected `,' or `;' vor »{«-Zeichen
In file included from main.cpp:9:
menu_fkts.hpp:8: Fehler: Variable oder Feld »save_data« als »void« deklariert
menu_fkts.hpp:8: Fehler: »QString« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:8: Fehler: »QString« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:8: Fehler: »QTableWidget« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:8: Fehler: »tw_data« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:8: Fehler: expected primary-expression vor "int"
menu_fkts.hpp:8: Fehler: expected primary-expression vor "int"
menu_fkts.hpp:9: Fehler: initializer Ausdrucksliste als zusammengesetzten Ausdruck behandelt
menu_fkts.hpp:9: Fehler: expected `,' or `;' vor »{«-Zeichen
menu_fkts.hpp:46: Fehler: Variable oder Feld »open_data« als »void« deklariert
menu_fkts.hpp:46: Fehler: »QString« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:46: Fehler: »QString« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:46: Fehler: »QTableWidget« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:46: Fehler: »table« wurde in diesem Gültigkeitsbereich nicht definiert
menu_fkts.hpp:47: Fehler: initializer Ausdrucksliste als zusammengesetzten Ausdruck behandelt
menu_fkts.hpp:47: Fehler: expected `,' or `;' vor »{«-Zeichen
In file included from main.cpp:11:
MyBoardWDG.h:15: Fehler: »QString« bezeichnet keinen Typ
MyBoardWDG.h:16: Fehler: »QString« bezeichnet keinen Typ
MyBoardWDG.h:28: Fehler: expected class-name vor »{«-Zeichen
MyBoardWDG.h:30: Fehler: ISO-C++ verbietet Deklaration von »Q_OBJECT« ohne Typ
MyBoardWDG.h:30: Fehler: expected `;' vor "private"
MyBoardWDG.h:32: Fehler: ISO-C++ verbietet Deklaration von »QFileDialog« ohne Typ
MyBoardWDG.h:32: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:34: Fehler: ISO-C++ verbietet Deklaration von »QPrinter« ohne Typ
MyBoardWDG.h:34: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:36: Fehler: ISO-C++ verbietet Deklaration von »QHBoxLayout« ohne Typ
MyBoardWDG.h:36: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:37: Fehler: ISO-C++ verbietet Deklaration von »QVBoxLayout« ohne Typ
MyBoardWDG.h:37: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:39: Fehler: ISO-C++ verbietet Deklaration von »QMenuBar« ohne Typ
MyBoardWDG.h:39: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:40: Fehler: ISO-C++ verbietet Deklaration von »QMenu« ohne Typ
MyBoardWDG.h:40: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:41: Fehler: ISO-C++ verbietet Deklaration von »QMenu« ohne Typ
MyBoardWDG.h:41: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:42: Fehler: ISO-C++ verbietet Deklaration von »QMenu« ohne Typ
MyBoardWDG.h:42: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:44: Fehler: ISO-C++ verbietet Deklaration von »QTableWidgetItem« ohne Typ
MyBoardWDG.h:44: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:45: Fehler: ISO-C++ verbietet Deklaration von »QTableWidgetItem« ohne Typ
MyBoardWDG.h:45: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:46: Fehler: ISO-C++ verbietet Deklaration von »QTableWidgetItem« ohne Typ
MyBoardWDG.h:46: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:50: Fehler: ISO-C++ verbietet Deklaration von »QTabWidget« ohne Typ
MyBoardWDG.h:50: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:51: Fehler: ISO-C++ verbietet Deklaration von »QTableWidget« ohne Typ
MyBoardWDG.h:51: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:53: Fehler: »QString« bezeichnet keinen Typ
MyBoardWDG.h:58: Fehler: expected `)' vor »*«-Zeichen
MyBoardWDG.h:61: Fehler: ISO-C++ verbietet Deklaration von »QVBoxLayout« ohne Typ
MyBoardWDG.h:61: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:64: Fehler: »QString« wurde nicht deklariert
MyBoardWDG.h:64: Fehler: »QString« wurde nicht deklariert
MyBoardWDG.h:64: Fehler: ISO-C++ verbietet Deklaration von »unit« ohne Typ
MyBoardWDG.h:64: Fehler: ISO-C++ verbietet Deklaration von »equip« ohne Typ
MyBoardWDG.h:66: Fehler: »QStringList« bezeichnet keinen Typ
MyBoardWDG.h:67: Fehler: ISO-C++ verbietet Deklaration von »QStringList« ohne Typ
MyBoardWDG.h:67: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:68: Fehler: ISO-C++ verbietet Deklaration von »QStringList« ohne Typ
MyBoardWDG.h:68: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:69: Fehler: ISO-C++ verbietet Deklaration von »QStringList« ohne Typ
MyBoardWDG.h:69: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:70: Fehler: ISO-C++ verbietet Deklaration von »QStringList« ohne Typ
MyBoardWDG.h:70: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:71: Fehler: ISO-C++ verbietet Deklaration von »QStringList« ohne Typ
MyBoardWDG.h:71: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:72: Fehler: ISO-C++ verbietet Deklaration von »QStringList« ohne Typ
MyBoardWDG.h:72: Fehler: expected `;' vor »*«-Zeichen
MyBoardWDG.h:78: Fehler: expected `:' vor "slots"
MyBoardWDG.h:80: Fehler: expected primary-expression vor "void"
MyBoardWDG.h:80: Fehler: ISO-C++ verbietet Deklaration von »slots« ohne Typ
MyBoardWDG.h:80: Fehler: expected `;' vor "void"
MyBoardWDG.h:84: Fehler: »QString« wurde nicht deklariert
MyBoardWDG.h:84: Fehler: ISO-C++ verbietet Deklaration von »T« ohne Typ
In file included from main.cpp:12:
Unit_Interface.h:17: Fehler: expected class-name vor »{«-Zeichen
Unit_Interface.h:21: Fehler: ISO-C++ verbietet Deklaration von »Q_OBJECT« ohne Typ
Unit_Interface.h:21: Fehler: expected `;' vor "private"
Unit_Interface.h:24: Fehler: »QStringList« bezeichnet keinen Typ
Unit_Interface.h:26: Fehler: ISO-C++ verbietet Deklaration von »QPushButton« ohne Typ
Unit_Interface.h:26: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:28: Fehler: ISO-C++ verbietet Deklaration von »QComboBox« ohne Typ
Unit_Interface.h:28: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:29: Fehler: ISO-C++ verbietet Deklaration von »QLabel« ohne Typ
Unit_Interface.h:29: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:30: Fehler: ISO-C++ verbietet Deklaration von »QLabel« ohne Typ
Unit_Interface.h:30: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:31: Fehler: ISO-C++ verbietet Deklaration von »QTableWidget« ohne Typ
Unit_Interface.h:31: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:32: Fehler: ISO-C++ verbietet Deklaration von »QListWidget« ohne Typ
Unit_Interface.h:32: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:33: Fehler: ISO-C++ verbietet Deklaration von »QLabel« ohne Typ
Unit_Interface.h:33: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:35: Fehler: »QStringList« bezeichnet keinen Typ
Unit_Interface.h:36: Fehler: »QStringList« bezeichnet keinen Typ
Unit_Interface.h:37: Fehler: »QStringList« bezeichnet keinen Typ
Unit_Interface.h:42: Fehler: ISO-C++ verbietet Deklaration von »QStringList« ohne Typ
Unit_Interface.h:42: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:49: Fehler: expected `;' vor "int"
Unit_Interface.h:63: Fehler: expected `)' vor »*«-Zeichen
Unit_Interface.h:69: Fehler: ISO-C++ verbietet Deklaration von »QGroupBox« ohne Typ
Unit_Interface.h:69: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:72: Fehler: ISO-C++ verbietet Deklaration von »QGroupBox« ohne Typ
Unit_Interface.h:72: Fehler: expected `;' vor »*«-Zeichen
Unit_Interface.h:75: Fehler: »QString« wurde nicht deklariert
Unit_Interface.h:75: Fehler: ISO-C++ verbietet Deklaration von »parameter« ohne Typ
Unit_Interface.h:76: Fehler: »QStringList« wurde nicht deklariert
Unit_Interface.h:76: Fehler: ISO-C++ verbietet Deklaration von »parameter« ohne Typ
Unit_Interface.h:81: Fehler: expected `:' vor "slots"
Unit_Interface.h:82: Fehler: expected primary-expression vor "void"
Unit_Interface.h:82: Fehler: ISO-C++ verbietet Deklaration von »slots« ohne Typ
Unit_Interface.h:82: Fehler: expected `;' vor "void"
Unit_Interface.h:84: Fehler: »QString« wurde nicht deklariert
Unit_Interface.h:84: Fehler: ISO-C++ verbietet Deklaration von »name« ohne Typ
Unit_Interface.h:88: Fehler: »QString« wurde nicht deklariert
Unit_Interface.h:88: Fehler: ISO-C++ verbietet Deklaration von »UName« ohne Typ
Unit_Interface.h: In member function `int* unit_interface::get_gPrice()':
Unit_Interface.h:52: Fehler: »price« wurde in diesem Gültigkeitsbereich nicht definiert
Unit_Interface.h:52: Warnung: Variable »price« wird nicht verwendet
In Datei, eingefügt von main.cpp:12:
Unit_Interface.h:91:7: Warnung: no newline at end of file
main.cpp: In function `int main(int, char**)':
main.cpp:19: Fehler: »QApplication« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp:19: Fehler: expected `;' vor "app"
main.cpp:22: Fehler: »class MyBoardWDG« hat kein Element namens »resize«
main.cpp:24: Fehler: »class MyBoardWDG« hat kein Element namens »show«
main.cpp:25: Fehler: »app« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp:19: Warnung: Variable »QApplication« wird nicht verwendet
main.cpp:25: Warnung: Variable »app« wird nicht verwendet
klingt sehr erschreckend )-:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

slash-ex hat geschrieben:mmh, das lag wohl an meiner *pro datei! nun bekomme ich aber solche fehler:

Code: Alles auswählen

xt_parse.hpp:22: Fehler: »QStringList« bezeichnet keinen Typ
txt_parse.hpp:73: Fehler: »QStringList« bezeichnet keinen Typ
txt_parse.hpp:113: Fehler: »QString« bezeichnet keinen Typ
txt_parse.hpp:147: Fehler: »QStringList« bezeichnet keinen Typ
txt_parse.hpp:182: Fehler: »QString« wurde in diesem Gültigkeitsbereich nicht definiert
txt_parse.hpp:182: Fehler: »QStringList« wurde in diesem Gültigkeitsbereich nicht definiert[/quote]
Hast du schonmal versucht die Header von QStringList / QString und was er sonst noch so sucht zu inkludieren. Wenn er sagt dass er es nicht kennt...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

mmh, war anscheinend noch ein fehler in der pro-datei, jetzt habe ich alle meine dateien dort eingetragen, ich weiß bloß nicht genau warum das includieren in den dateien selbst nicht ausreicht?!

so, nun habe ch diesen fehler:

Code: Alles auswählen

make: *** Keine Regel vorhanden, um das Target »Unit_Interface.moc«,
  benötigt von »Unit_Interface.o«, zu erstellen.  Schluss.
diese klasse sieht so aus:

Code: Alles auswählen

#ifndef UNIT_INTERFACE_H
#define UNIT_INTERFACE_H

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

#include <QtGui>

#include <iostream>
#include "txt_parse.hpp"
#include "menu_fkts.hpp"

#include "MyBoardWDG.h"

class Unit_Interface : 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;
	}

	int *get_gPrice()
	{
		int *adresse;
		adresse = &price;
		return adresse;
	}

	int *get_mPrice()
	{
		int *adresse;
		adresse = &mod_e_price;
		return adresse;
	}

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

	virtual ~Unit_Interface()
	{
	}

	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

	void setUnitEquipment(QString name = "all"); //füllt liste; connections im entspr. layout

	void saveSelectedEquipment(); //speichert ausgewählte ausrüstung in QStringList ;manipuliert auch den preis im bezug auf ausrüstung

	void setUnit_price(QString UName); // preis nur im bezug auf figur
};

#endif
und
die implementation:

Code: Alles auswählen

#include "Unit_Interface.h" 

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

	void Unit_Interface::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", quell_pfad_equip, name);
		setEquipList(str_lst);
	}

	void Unit_Interface::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 Unit_Interface::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_Interface::Unit_Interface(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_Interface::createHorizontalGroupBox_profile();
	//Ausrüstung
	Unit_Interface::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_Interface::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_Interface::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_Interface::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_Interface::setEquipList(QStringList list)
{
	unit_equipment_list->clear();
	unit_equipment_list->addItems(list);
	std::cout<<"Equip_List gesetzt."<<std::endl;
} 

#include "Unit_Interface.moc"

wann muss ich eigentlich das *.moc includieren? wann ist das Q_OBJECT in der klasse nötig? irgendwie habe ich das immer nur deswegen gemacht, weil es mir der compiler befohlen hatte :roll:

ich hatte dies als erstes größeres project in angriff genommen, allerdings scheint das aufspalten des projektes etwas komplizierter zu sein als in standard-c++ :?:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das moc wird normalerweise automatisch von qmake erzeugt.
Wenn Du nicht weisst warum das nötig ist, würde ich Dir raten, erstmal ein bischen Doku zulesen
http://doc.trolltech.com/4.1/moc.html
http://doc.trolltech.com/4.1/qmake-manual.html
http://doc.trolltech.com/4.1/signalsandslots.html

Dein Fehler ist wohl, die Klassendefinition in der Source-Datei zu machen anstatt (wie in C++ üblich) in einem eigenen Header. Dadurch kann qmake dann auch kein moc davon erzeugen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

danke für die links :wink:
Dein Fehler ist wohl, die Klassendefinition in der Source-Datei zu machen anstatt (wie in C++ üblich) in einem eigenen Header. Dadurch kann qmake dann auch kein moc davon erzeugen.
wie meinst du das? ich habe die klasse in eine *.h und die implementation in eine *.cpp gespeichert.

das ist meine *.pro datei

Code: Alles auswählen

HEADERS += Unit_Interface.h \
	   MyBoardWDG.h 

SOURCES += main.cpp \
	   Unit_Interface.cpp \
	   MyBoardWDG.cpp \
	   txt_parse.hpp \
	   menu_fkts.hpp

TARGET = ../bin/wh40k
wobei die klasse MyBoardWDG das fenster und tabs macht und die klasse Unit_Interface den inhalt des tabs zeichnet.
die *.hpp's txt_parse und menu_fkts. sollen lediglich einige funktionen bereitstellen.
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

merkwürdig ist, als ich alle klassen in der main.cpp hatte, funktionierte das compiling noch. irgendwie schaff ich es nur nicht das ganze schön aufzuspalten (in Qt) darum sind die klassen auch recht unübersichlich geworden...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Seit wann ist .hpp ein source-File?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

meinst du wenn ich die dateien wo eh nur funktionen drin stehen zu ner *.cpp datei umbenenne, klappt alles.
[hopefully]
==>werds gleich mal probieren [gaubs aber nicht :( ]

UPDATE:
ne hat nicht funktioniert, irgendwo muss also was an der klasse falsch sein. :cry: ich glaub ich werd das nie verstehen was hier falsch ist :(
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was hast du denn jetzt noch genau für Probleme?
Häng mal dein Projekt als Anhang (gepackt) ran damit man es sich mal anschauen kann.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

danke für die hilfe!
update:
ich habe meine sourcen gepackt, ich hoffe du oder irgendjemand findet den fehler (bzw. fehler die womöglich beim aufteilen auf verschiedene dateien entstanden sind... denke ich ahbe aber keine gemacht)
Dateianhänge
all in main.zip
aktuelle vs in der alles in der main steht
==> funktioniert
(8.82 KiB) 120-mal heruntergeladen
meine src_Win.zip
meine aktuelle aufgeteilte version
==> funktioniert nicht
(10.73 KiB) 105-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

So, nach ein paar Änderungen habe ich es kompiliert und gelinkt bekommen :)

Hier meine Anmerkungen

src.pro:
- nur ein parr Schönheitskorrekturen

main.cpp:
- Unit_Interface.h wird nicht gebraucht (Schönheitskorrektur)

menu_fkts.cpp:
- menu_fkts.h erstellt (siehe weiter unten)

txt_parse.cpp:
- txt_parse.h erstellt (siehe weiter unten)

MyBoardWDG.h und Unit_Interface.h
- Man inkludiert in einem Header keine Sourcen. Das führt zu mehrfachen Definitionen von Funktionen und ist auch gar nicht nötig. Deshalb abe ich die zwei Header erstellt.
- config.h inkludiert man auch nicht im Header - nur im Source. config.h ist kein öffentlicher Header und hat in keinem Header was zu suchen!
- extern const QString hab ich ändern müssen (da sonst mehrfache Definitionen auftreten)
- andere Kleinigkeiten damit eskompiliert (die Du mit 'diff -u' schon rausfindest ;) )

Der Grund warum qmake nicht richtig wollte, waren die zwei '#include Unit_Interface.moc' und '#include MyBoardWDG.moc'. Diese sind nur nötig wenn du automake/autoconf verwendest. qmake macht dies etwas intelligenter und fügt die beiden moc-Files automatisch zu den Sourcen mit hinzu. Ausserdem ist die Benamung etwas anders (wenn Du mehr drüber wissen willst, lass es mich wissen).

Was ich nicht ganz verstehe sind deine 3 getter-Funktionen (get_EquipList, get_gPrice, get_gmPrice) - warum werden dort Pointer zurückgegeben? Dann könnte man die Variablen gleich public machen wenn sie jeder ändern darf...
Dateianhänge
src.zip
(9.42 KiB) 123-mal heruntergeladen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

:shock: vielen dank :!:
mal schauen was du alles gemacht hast :arrow: :arrow: :arrow: :arrow:

also zu den get_fkt.
ich hatte die funktion aber wirklich unglücklich formuliert. :oops: , das poste ich lieber nicht...

Code: Alles auswählen

	
int *Unit_Interface::get_mPrice()
{
	return &mod_e_price;
}
meine andere klasse(MyBoardWDG) beherbergt ein tabellenwidget was ein paar daten aus der klasse Unit_Interface braucht. indem fall der durch das equipment modifizierte preis.

vielleicht hast du gesehen das ich in der klasse MyBoardWDG: für jedes tab ein neues objekt von Unit_Inferface erstellt habe. mit hilfe dieser funktion kann ich dann noch auf die adresse der preis-variable zugreifen.
das habe ich nur gemacht, weil versuche anderwaltig auf den inhalt des preises zuzugreifen kläglich scheiterten. weißt du eine bessere möglichkeit um auf variablen von objekten zuzugreifen? ich habe das gefühl dass, das irgendwie gefährlich sein kann, was ich gemacht habe...

aus MyBoardWDG:

Code: Alles auswählen

int *U_mPrice;
...
U_mPrice = HQ->get_mPrice();
...dummerweise funktioniert die preisberechnung nicht mehr nach dem umstrukturieren, ich werd mal schauen warum. (ahh jetzt hab ichs, ich bekomme beim ausführen ":Object::connect: No such slot Unit_Interface::setUnit_price(QString)"
==>alles wieder funktionieren tut :lol: hab eine funktion nicht als slot deklariert)

so dann ist mir aufgefallen: bei dir heißen die public slots auf einmal Q_SLOTS
:?: aber nachdem ich deinen beispiel gefolgt bin und alle meine fehler gesucht habe scheint es mit einem normalem "slots" auch zu funktionieren. wo ist da der unterschied?
Ausserdem ist die Benamung etwas anders (wenn Du mehr drüber wissen willst, lass es mich wissen).
auf jeden fall! THX
Dateianhänge
wh_40k.tar.gz
ich hatte vergessen ein paar beispiel dateien mitzugeben(zum auslesen), fall es jemanden interessiert.... das funktionierende projekt
(9.7 KiB) 129-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

slash-ex hat geschrieben::shock: vielen dank :!:
mal schauen was du alles gemacht hast :arrow: :arrow: :arrow: :arrow:

also zu den get_fkt.
ich hatte die funktion aber wirklich unglücklich formuliert. :oops: , das poste ich lieber nicht...

Code: Alles auswählen

	
int *Unit_Interface::get_mPrice()
{
	return &mod_e_price;
}
meine andere klasse(MyBoardWDG) beherbergt ein tabellenwidget was ein paar daten aus der klasse Unit_Interface braucht. indem fall der durch das equipment modifizierte preis.

vielleicht hast du gesehen das ich in der klasse MyBoardWDG: für jedes tab ein neues objekt von Unit_Inferface erstellt habe. mit hilfe dieser funktion kann ich dann noch auf die adresse der preis-variable zugreifen.
das habe ich nur gemacht, weil versuche anderwaltig auf den inhalt des preises zuzugreifen kläglich scheiterten. weißt du eine bessere möglichkeit um auf variablen von objekten zuzugreifen? ich habe das gefühl dass, das irgendwie gefährlich sein kann, was ich gemacht habe...
Ja, ganz normal per Rückgabe

Code: Alles auswählen

int Unit_Interface::get_mPrice();
int Unit_Interface::get_Price();
const QStringList &Unit_Interface::get_EquipList();
slash-ex hat geschrieben: so dann ist mir aufgefallen: bei dir heißen die public slots auf einmal Q_SLOTS
:?: aber nachdem ich deinen beispiel gefolgt bin und alle meine fehler gesucht habe scheint es mit einem normalem "slots" auch zu funktionieren. wo ist da der unterschied?
Soweit ich weiss war dies eine Änderung ab 4.0 damit man eindeutigere Namen hatte. Da kein Compiler 'public slots:' kennt, muss slots zu nichts definiert werden (#define slots '). Da aber slots ein allgemeiner Begriff ist, gab es da manchmal Probleme mit Code der z.B. die Variable 'slots' benutzt hat. Q_SLOTS/Q_SIGNALS ist einfach eindeutiger.
slash-ex hat geschrieben:
Ausserdem ist die Benamung etwas anders (wenn Du mehr drüber wissen willst, lass es mich wissen).
auf jeden fall! THX
Als ich dies das erste Mal gesehen habe bin ich auch etwas durcheinander gekommen. Das Problem liegt, wie schon gesagt, in der unterschiedlichen Benamung der von moc.exe erstellten Files.
Es gibt zwei verschiedene moc-Files
- mocs, die aus Headern erstellt werden (moc_header)
- mocs, die aus Sourcen erstellt werden (moc_source)

In qmake:
moc_sources immer '<filename>.moc'
moc_header immer 'moc_<filename>.cpp'.
Automake/nusermake/CMake:
moc_sources '<filename>_moc.cpp
moc_header '<filename>.moc'.

Da qmake einen dependency-scanner hat und das include gesehen hat , ist es durcheinander gekommen (automake moc_header == qmake moc_source ... :().
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

mir ist grad nochmal was eingefallen! als ich alles noch in einer datei (main.cpp) stehen hatte muuste ich noch ein main.moc includieren damit ich nicht diesen fehler bekomme:

Code: Alles auswählen

/home/daniel/qt/backup/wh40k_old/src/main.cpp:143: undefined reference to `vtable for unit_interface'
/home/daniel/qt/backup/wh40k_old/src/main.cpp:143: undefined reference to `vtable for unit_interface'
/home/daniel/qt/backup/wh40k_old/src/main.cpp:143: undefined reference to `vtable for unit_interface'
/home/daniel/qt/backup/wh40k_old/src/main.cpp:143: undefined reference to `vtable for unit_interface'
main.o: In function `MyBoardWDG':
/home/daniel/qt/backup/wh40k_old/src/main.cpp:540: undefined reference to `vtable for MyBoardWDG'
/home/daniel/qt/backup/wh40k_old/src/main.cpp:540: undefined reference to `vtable for MyBoardWDG'
/home/daniel/qt/backup/wh40k_old/src/main.cpp:540: undefined reference to `vtable for MyBoardWDG'
/home/daniel/qt/backup/wh40k_old/src/main.cpp:540: undefined reference to `vtable for MyBoardWDG'
main.o: In function `unit_interface::tr(char const*, char const*)':
/home/daniel/qt/backup/wh40k_old/src/main.cpp:33: undefined reference to `unit_interface::staticMetaObject'
main.o: In function `MyBoardWDG::tr(char const*, char const*)':
/home/daniel/qt/backup/wh40k_old/src/main.cpp:277: undefined reference to `MyBoardWDG::staticMetaObject'
main.o: In function `~MyBoardWDG':
/home/daniel/qt/backup/wh40k_old/src/main.cpp:310: undefined reference to `vtable for MyBoardWDG'
/home/daniel/qt/backup/wh40k_old/src/main.cpp:310: undefined reference to `vtable for MyBoardWDG'
collect2: ld gab 1 als Ende-Status zurück
make: *** [../bin/wh40k] Fehler 1
warum ist es bei dem aufgeteilten projekt nicht der fall? müsste qmake nicht bei der main.cpp genauso funktionieren? oder funktioniert qmake nur wenn alle klassen eine seperate header bekommen?
Antworten