[geloest] Signal and Slot bei QTabWidget?

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

[geloest] Signal and Slot bei QTabWidget?

Beitrag von Qt_Starter »

Hallo,

ich will ein QTabWidget "dynamisch" füllen, das würde ich wie folgt machen:

Code: Alles auswählen

#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
#include <QHash>
#include <QTabWidget>

class fstTestProject : public QMainWindow
{
	Q_OBJECT

public:
	fstTestProject(QWidget *parent = 0, Qt::WFlags flags = 0);
	~fstTestProject();

	void fillQHashLists();

private:
	Ui::fstTestProjectClass ui;

	QLabel *myLabel[12];
	QLineEdit *myLineEdit[12];

	QGridLayout *myLayout;

	QHash<int, QString> optNames;
	QHash<int, QString> optValues;

	QTabWidget* myTabWidget;
};

Code: Alles auswählen

#include "fsttestproject.h"

#include <QFont>
#include <QWidget>

fstTestProject::fstTestProject(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);

	fillQHashLists();

	myTabWidget = new QTabWidget;
	
	
	int hashSize = optNames.size();
	
	myLayout = new QGridLayout;	

	for(int m=0; m<hashSize; m++)
	{
		QWidget* page;
		page = new QWidget;
		myTabWidget->addTab(page, optNames[m]);

		QGridLayout *pageLayout = new QGridLayout;
		page->setLayout(pageLayout);

		for(int i=0; i<hashSize; i++)
		{
			myLabel[i] = new QLabel(optNames[i]);
			myLineEdit[i] = new QLineEdit(optValues[i]);
		}

		for(int k=0; k<hashSize; k++)
		{		
			pageLayout->addWidget(myLabel[k], k, 0);
			pageLayout->addWidget(myLineEdit[k], k, 1);
		}		
	}


	QGridLayout* basicLayout = new QGridLayout;

	ui.centralWidget->setLayout(basicLayout);

	basicLayout->addWidget(myTabWidget);
}

fstTestProject::~fstTestProject()
{
}

void fstTestProject::fillQHashLists()
{
	for(int j=0; j<8; j++)
	{
		QString name = "Wert ";
		QString zahl;
		zahl.setNum(j, 10);
		name.append(zahl);
		optNames[j] = name;
		optValues[j] = zahl;
	}	
}
es funktioniert auch soweit. Aber jetzt weiß ich nicht, wo ich ansetzten muss, wenn man das QLineEdit editiert, damit ich die Veränderung dann auch später in meinem QHash (z.B. optNames, oder optValues) speichern kann.
Generell würde ich es so machen wie in "Qt4 Einführung in die Applikationsentwicklung" bei dem Beispiel mit dem ByteConverter, jedoch weiß ich hier nicht wie ich das jeweilige LineEdit ansprechen kann, da es ja zu Beginn noch nicht wirklich existiert?
Hat jemand einen Tip?
Zuletzt geändert von Qt_Starter am 11. Januar 2008 12:14, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was geht nicht? Es gibt ein Signal QLineEdit::editingFinished() welches mit deiner Speicherroutine verbunden wird. Damit Du weisst welches LineEdit es ist würde ich QSignalMapper empfehlen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt_Starter
Beiträge: 23
Registriert: 16. November 2007 21:04

@Christian

Beitrag von Qt_Starter »

Danke vorab, ich glaube das mir die Klasse QSignalMapper weiterhelfen kann.
Hab aber noch nicht raus, wie es geht :( .

Hab das angegebene Beispiel ausprobiert und versucht umzuschreiben, aber leider liefert es mir nur den alten Wert und nicht den geänderten Wert ...
Hier mein Code:

Code: Alles auswählen

#include "ButtonWidget.h"
#include <QLineEdit>


ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
     : QWidget(parent)
 {
     signalMapper = new QSignalMapper(this);

     QGridLayout *gridLayout = new QGridLayout;

     for (int i = 0; i < texts.size(); ++i) 
	 {
		 QLineEdit *lineEdit = new QLineEdit(texts[i]);
   
         connect(lineEdit, SIGNAL(textChanged(const QString & )), signalMapper, SLOT(map()));
         signalMapper->setMapping(lineEdit, texts[i]);
         gridLayout->addWidget(lineEdit, i / 3, i % 3);

     }

	 connect(signalMapper, SIGNAL(mapped(const QString &)),
             this, SLOT(specialSlot(const QString &)));

     setLayout(gridLayout);	 
 } 

ButtonWidget::~ButtonWidget()
{
}

void ButtonWidget::specialSlot(const QString& name)
{
	QString value;
	value = name;
}
Wenn ich jetzt eines der LineEdits ändere, dann sollte der "neue" Wert ja in der Variable "value" zu sehen sein(zumindest im Debug - Modus). Doch leider erscheint dann immer nur der alte vorgegebene Wert?
Kannst du mir da weiter helfen?
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

Hi,

also ich würd's anhand von Christians Hinweis ungefähr so machen...

class ButtonWidget: public QWiget
{
Q_OBJECT

[...]

QMap<int,QLineEdit*> widgetMap;

[...]
};

ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
: QWidget(parent)
{
signalMapper = new QSignalMapper(this);

QGridLayout *gridLayout = new QGridLayout;

for (int i = 0; i < texts.size(); ++i)
{
QLineEdit *lineEdit = new QLineEdit(texts);

connect(lineEdit, SIGNAL(editingFinished()), signalMapper, SLOT(map()));
signalMapper->setMapping(lineEdit, i);
widgetMap = lineEdit;
gridLayout->addWidget(lineEdit, i / 3, i % 3);

}

connect(signalMapper, SIGNAL(mapped(const int)),this, SLOT(specialSlot(const int)));
setLayout(gridLayout);
}



void ButtonWidget::specialSlot(const int id)
{
QLineEdit widget = widgetMap[id];
QString value(widget->text());
}
Qt_Starter
Beiträge: 23
Registriert: 16. November 2007 21:04

Beitrag von Qt_Starter »

Danke, hab es auch schon so ähnlich gemacht und es funktioniert :D
Antworten