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_HCode: 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();
}Code: Alles auswählen
QLineEdit *workingLineEdit = findChild<QLineEdit *>(widgetID);