Seite 1 von 1

von doubleSpinBox nach lineEdit mit Hash

Verfasst: 4. Februar 2009 14:29
von nici
hallo, ich möchte mit der Hash-fkt eine Reihe von LineEdits durchlaufen. doch leider klappt es nicht ganz. Ich hatte vorher doubleSpinBoxes drin, doch die soll ich durch lineEdits ersetzten. Kann mir bitte jmd helfen.

Code: Alles auswählen

while(it.hasNext()) {
		it.next() ;
		//qDebug() << "Key \"" << it.key() << "\": insert value "
		//<< n.readDouble(it.key()) << endl ;
		it.value()->setText(n.readDouble(QString::QString(_sectionAberrations).append(it.key()))) ;
}
lg

nici

Verfasst: 4. Februar 2009 14:43
von franzf
"mit der Hash-fkt" bedeutet, dass du einen QHash verwedest, in dem deine LineEdits liegen? und it ist eine QHashIterator?
Und was klappt denn nicht so ganz?
Kompiliert es nicht?
QHashIterator ist im Übrigen ein "Java style const Iterator", was bedeutet, dass die value()s nicht verändert werden können, somit das setText() nicht klappen wird (da hakt es wohl, oder?)

Dann verwende doch einfach einen QHash::iterator.
Da klappt halt kein it.next(), dafür ein it++.

Grüße
Franz

Verfasst: 4. Februar 2009 14:54
von nici
ja setText klappt nicht: meinst du das mit dem Iterator so:

Code: Alles auswählen

[code]QHash<QString, int>::iterator i;
 for (i = hash.begin(); i != hash.end(); ++i)
     cout << i.key() << ": " << i.value() << endl;
[/code]

Verfasst: 4. Februar 2009 14:56
von franzf
nici hat geschrieben:ja setText klappt nicht: meinst du das mit dem Iterator so:

Code: Alles auswählen

[code]QHash<QString, int>::iterator i;
 for (i = hash.begin(); i != hash.end(); ++i)
     cout << i.key() << ": " << i.value() << endl;
[/code]
Hast du es denn versucht zu kompilieren?
(Ja ich hab es so gemeint, aber kompilieren musst du es schon ;))

Verfasst: 4. Februar 2009 15:17
von nici
ähm ja ich hab es versucht aber es kommen Fehlermeldungen

Tabzwei.cpp: In member function 'void TabZwei::open()':
Tabzwei.cpp:64: error: no match for 'operator=' in 'i = ((TabZwei*)this)->TabZwei::_hash. QHash<Key, T>::begin [with Key = QString, T = QLineEdit*]()'
/usr/include/qt4/QtCore/qhash.h:267: note: candidates are: QHash<QString, int>::iterator& QHash<QString, int>::iterator::operator=(const QHash<QString, int>::iterator&)
/usr/include/qt4/QtCore/qhash.h:326: error: 'QHash<Key, T>::iterator::operator bool() const [with Key = QString, T = int]' is private
Tabzwei.cpp:64: error: within this context
/usr/include/qt4/QtCore/qhash.h:326: error: 'QHash<Key, T>::iterator::operator bool() const [with Key = QString, T = QLineEdit*]' is private
Tabzwei.cpp:64: error: within this context
Tabzwei.cpp:65: error: 'cout' was not declared in this scope
Tabzwei.cpp: In member function 'void TabZwei::saveData()':
Tabzwei.cpp:81: error: no matching function for call to 'QHashIterator<QString, QDoubleSpinBox*>::QHashIterator(QHash<QString, QLineEdit*>&)'
/usr/include/qt4/QtCore/qhash.h:873: note: candidates are: QHashIterator<Key, T>::QHashIterator(const QHash<Key, T>&) [with Key = QString, T = QDoubleSpinBox*]
/usr/include/qt4/QtCore/qhash.h:873: note: QHashIterator<QString, QDoubleSpinBox*>::QHashIterator(const QHashIterator<QString, QDoubleSpinBox*>&)
make: *** [Tabzwei.o] Fehler 1

Verfasst: 4. Februar 2009 15:22
von franzf
Dann poste mal bitte Zeilen 60-90.

Verfasst: 4. Februar 2009 15:25
von nici

Code: Alles auswählen

void TabZwei::open(){
	
	QString fileName = QFileDialog::getOpenFileName(this, "Open File", "/home/nurc/QtOrdner/QtAufgNeu", ("Datei(*.ini *.txt *.dat *.odt)"));
	qDebug() << "Filename: " << fileName << endl ;
	NSettings n(fileName, this);
if (!fileName.length()) return;
	qDebug() << "Status: " << static_cast<int>(n.status()) << endl ;
	qDebug() << "All keys: " << n.allKeys() << endl ; 
    QHash<QString, int>::iterator i;
 for (i = _hash.begin(); i != _hash.end(); ++i)
     cout << i.key() << ": " << i.value() << endl;
	
	double apertureAngle=n.readDouble(QString::QString(_sectionParameters).append(_idApertureAngle));
	apertureAngleLE->setText(QString::number(apertureAngle));

	double highTension=n.readDouble(QString::QString(_sectionParameters).append(_idhighTension));
	highTensionLE->setText(QString::number(highTension));
}

void TabZwei::saveData(){

	QString fileName = QFileDialog::getSaveFileName(this, "Open File", "/home", ("Datei(*.ini *.txt *.dat *.odt)"));
	qDebug() << "Filename: " << fileName << endl ;
	NSettings n(fileName, this);
	qDebug() << "Status: " << static_cast<int>(n.status()) << endl ;
	
	QHashIterator<QString , QDoubleSpinBox * > it(_hash) ;
	while(it.hasNext()) {
		it.next() ;
		qDebug() << "Key \"" << it.key() << "\": read value "
		<< n.readDouble(it.key()) << endl ;
		n.setValue(QString::QString(_sectionAberrations).append(it.key()), it.value()->value()) ;
	}
	
	bool ok=false;
	double apertureAngle = apertureAngleLE->text().toDouble(&ok);
	if(ok) {
		n.setValue(QString::QString(_sectionParameters).append(_idApertureAngle), apertureAngle) ;
	}
	else {
		showConvError(apertureAngleLE->text(), QString("1"));
		qDebug()<< "Apertur Winkel ist falsch";
	}
	double highTension= highTensionLE->text().toDouble(&ok);
	if(ok){
		n.setValue(QString::QString(_sectionParameters).append(_idhighTension), highTension);
	}else {	
		showConvError(highTensionLE->text(), QString("3"));
		qDebug()<< "Energie ist falsch";
	}
	n.sync() ;
	qDebug() << "All keys: " << n.allKeys() << endl ;	
};

Verfasst: 4. Februar 2009 15:32
von franzf
Wie ist "_hash" definiert?
Denn du schreibst:

Code: Alles auswählen

QHash<QString, int>::iterator i;
 for (i = _hash.begin(); i != _hash.end(); ++i)
und später:

Code: Alles auswählen

QHashIterator<QString , QDoubleSpinBox * > it(_hash) ; 
Aber eigentlich wolltest du doch QDoubleSpinBox durch QLineEdit ersetzen?

Und außerdem hättest du an zweiter Stelle den QHashIterator gegen einen QHash::iterator austauschen sollen, wegen dem setText().

Verfasst: 4. Februar 2009 15:37
von nici
hallo,

also _hash habe ich so in der h-Datei:

Code: Alles auswählen

 protected:
		QHash<QString, QLineEdit *> _hash;

Verfasst: 4. Februar 2009 15:41
von franzf
nici hat geschrieben:hallo,

also _hash habe ich so in der h-Datei:

Code: Alles auswählen

 protected:
		QHash<QString, QLineEdit *> _hash;
Dann solltest du die Typen bei den Iteratoren auch genau(!) so angeben.
Also

Code: Alles auswählen

QHash<QString, QLineEdit *>::iterator i;

Verfasst: 4. Februar 2009 15:50
von nici
und was ist mit

Code: Alles auswählen

_hash.insert("C5", lineEdit_C5), _hash.insert("C7", lineEdit_C7);
muss ich daraus

Code: Alles auswählen

i.insert("C1", lineEdit_C1);
	i.insert("C3", lineEdit_C3);
machen, aber dann funktioniert insert nicht.

Verfasst: 4. Februar 2009 15:55
von franzf
nici hat geschrieben:und was ist mit

Code: Alles auswählen

_hash.insert("C5", lineEdit_C5), _hash.insert("C7", lineEdit_C7);
muss ich daraus

Code: Alles auswählen

i.insert("C1", lineEdit_C1);
	i.insert("C3", lineEdit_C3);
machen, aber dann funktioniert insert nicht.
Nein!
Der iterator ist dazu da, die Elemente des Hash abzuklappern, insert um in das hash einzufügen.
Darum musst du natürlich weiterhin _hash.insert(); ausführen. (Ich hoffe das Komma zwischen deinen beiden insert steht nicht wirklich so im Quelltext, das geht auch nicht...)

Verfasst: 4. Februar 2009 16:04
von nici
jep stimmt,
ne das Komma ist im Code nicht so. ^^
Es kommen aber immer noch viele Fehlermeldungen die ich nicht verstehe.

Tabzwei.o Tabzwei.cpp
Tabzwei.cpp:107: error: 'apertureAngleLE' was not declared in this scope
Tabzwei.cpp:108: error: expected unqualified-id before 'if'
Tabzwei.cpp:111: error: expected unqualified-id before 'else'
Tabzwei.cpp:115: error: 'highTensionLE' was not declared in this scope
Tabzwei.cpp:116: error: expected unqualified-id before 'if'
Tabzwei.cpp:118: error: expected unqualified-id before 'else'
Tabzwei.cpp:122: error: expected constructor, destructor, or type conversion before '.' token
Tabzwei.cpp:123: error: expected constructor, destructor, or type conversion before '<<' token
Tabzwei.cpp:124: error: expected declaration before '}' token
make: *** [Tabzwei.o] Fehler 1

Verfasst: 4. Februar 2009 16:13
von nici
ahh ok, das war alles ein Klammerungsfehler ^^, aber ich bekomme ein problem mit den Libraries

/QtOrdner/qtAufgNeu/AufgLineEdit$ ./AufgLineEdit
./AufgLineEdit: error while loading shared libraries: libcstools.so: cannot open shared object file: No such file or directory
nurc@praktikum:~/QtOrdner/qtAufgNeu/AufgLineEdit$

Verfasst: 4. Februar 2009 16:18
von nici
ok es geht jetzt, vielen dannkkkkk.

lg

nici