SignalMapper bringt Programm zum Absturz

Alles rund um die Programmierung mit Qt
Qt_Starter
Beiträge: 23
Registriert: 16. November 2007 21:04

@Funktionsaufruf auf Nullpointer

Beitrag von Qt_Starter »

Hallo,

wie es sich anhört, habe ich ein ähnliches Problem wie das hier geschilderte. Ich verwende auch den SignalMapper um in einem TabWidget an den Inhalt meiner LineEdits zu kommen.
Wenn ich dann zur Laufzeit etwas in einem der LineEdits ändere, dann kommt versuche ich über die findChild - Methode das entsprechende LineEdit zu finden, was jedoch fehl schlägt und so zum Absturz(Speicherfehler) führt.

Hier mein Code:

Code: Alles auswählen

#ifndef TABGENERATOR_H
#define TABGENERATOR_H

#include "DataObjectConfiguration.h"
#include "DataObjectSection.h"	

#include <QStringList>
#include <QTabWidget>
#include <QHash>
#include <QLabel>
#include <QLineEdit>
#include <QLayout>
#include <QWidget>

#include <QSignalMapper>

class TabGenerator : public QObject
{
	Q_OBJECT

public:
	TabGenerator();
	~TabGenerator();

	void setTabEditor(QTabWidget *);
	QTabWidget *getTabEditor();

	void setSectionNames(QStringList );
	QStringList getSectionNames();

	void setSectionList(QHash<int, DataObjectSection*> );
	QHash<int, DataObjectSection*> getSectionList();

	void buildTabWidget();	

	public slots:
		void lineEditChanged(const QString &);
		
private:
	QTabWidget *tabEditor;
	QStringList sectionNames;
	QHash<int, DataObjectSection*> sectionList;

	QGridLayout *tabLayout;

	QSignalMapper *signalMapper;

	QString generateCurrentID(QString, int);
	QString generateUpdateMessage(QString, QString);
	QLabel *tabLabel;	
};

#endif // TABGENERATOR_H
und

Code: Alles auswählen

#include "TabGenerator.h"

TabGenerator::TabGenerator()
{
	tabEditor = new QTabWidget;	
}

TabGenerator::~TabGenerator()
{
}

void TabGenerator::setTabEditor(QTabWidget *tab)
{
	tabEditor = tab;
}

QTabWidget *TabGenerator::getTabEditor()
{
	return tabEditor;
}

void TabGenerator::setSectionNames(QStringList list)
{
	sectionNames = list;
}

QStringList TabGenerator::getSectionNames()
{
	return sectionNames;
}

void TabGenerator::setSectionList(QHash<int,DataObjectSection*> secList)
{
	sectionList = secList;
}

QHash<int, DataObjectSection*> TabGenerator::getSectionList()
{
	return sectionList;
}

QString TabGenerator::generateCurrentID(QString name, int pos)
{
	QString secNameBuffer = name;
	secNameBuffer.append("*");
	QString optionID;
	optionID.setNum(pos, 10);
	secNameBuffer.append(optionID);	
	return secNameBuffer;
}

void TabGenerator::buildTabWidget()
{
	int sectionCount = sectionList.size();
	signalMapper = new QSignalMapper(this);	
	

	for (int i=0; i<sectionCount; i++)
	{	
		QString secName = sectionNames.at(i);

		DataObjectSection *currentSectionDO = new DataObjectSection;
		currentSectionDO = sectionList[i];

		QStringList optionNames = currentSectionDO->getOptionNames();
		QStringList optionValues = currentSectionDO->getOptionValues();
		
		/**
		*	jetzt habe ich alle Informationen gesammelt um den Tab zu fuellen!
		*/
		int optionCount = optionNames.size();

		QWidget *tabPage = new QWidget(tabEditor);
		tabPage->setObjectName(secName);
		tabEditor->addTab(tabPage, secName);
		tabLayout = new QGridLayout;
		QHBoxLayout *mainTabLayout = new QHBoxLayout;

		tabPage->setLayout(tabLayout);		
		tabLayout->setColumnMinimumWidth(0,10);
		tabLayout->setColumnMinimumWidth(2,10);
		tabLayout->setColumnMinimumWidth(4,10);		
		
		/**
		*	Tab mit dazugehoerigem Namen wurde erstellt, jetzt muss der Tab
		*	noch mit Inhalt gefuellt werden!
		*/
		for(int k=0; k<optionCount; k++)
		{			
			QString objNameID = generateCurrentID(secName, k);
			tabLabel = new QLabel(tabPage);
			tabLabel->setText(optionNames.at(k));			
			QLineEdit *tabLineEdit = new QLineEdit(tabPage);
			tabLineEdit->setText(optionValues.at(k));
			tabLineEdit->setObjectName(objNameID);			

			connect(tabLineEdit, SIGNAL(textChanged(const QString &)), signalMapper, SLOT(map()));
			
			signalMapper->setMapping(tabLineEdit, objNameID);
			
			tabLayout->addWidget(tabLabel,k,1);
			tabLayout->addWidget(tabLineEdit,k,3);			
		}				
		connect(signalMapper, SIGNAL(mapped(const QString &)),
             this, SLOT(lineEditChanged(const QString &)));		
	}	
}

/**
*		Implementierung der SLOTS
*/


void TabGenerator::lineEditChanged(const QString & widgetID)
{	
	QLineEdit *workingLineEdit = findChild<QLineEdit *>(widgetID);

	QString value = workingLineEdit->text();	
}
Wobei das LineEdit an dieser Stelle:

Code: Alles auswählen

QLineEdit *workingLineEdit = findChild<QLineEdit *>(widgetID);
nicht gefunden wird ...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Code: Alles auswählen

QLineEdit *workingLineEdit = findChild<QLineEdit *>(widgetID);
Naja.. überleg mal wen (nicht was) du da suchen lässt...

Code: Alles auswählen

void TabGenerator::lineEditChanged(const QString & widgetID)
{   
   QLineEdit *workingLineEdit = tabEditor->findChild<QLineEdit *>(widgetID); // <- LineEdits sind auf tabEditor
   Q_ASSERT(workingLineEdit); // huebscher als ein crash...
   QString value = workingLineEdit->text();   
}
Antworten