Seite 1 von 1

[geloest] Signal and Slot bei QTabWidget?

Verfasst: 9. Januar 2008 15:45
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?

Verfasst: 9. Januar 2008 17:09
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.

@Christian

Verfasst: 9. Januar 2008 22:34
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?

Verfasst: 11. Januar 2008 09:55
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());
}

Verfasst: 11. Januar 2008 12:16
von Qt_Starter
Danke, hab es auch schon so ähnlich gemacht und es funktioniert :D