Seite 1 von 1

[gelöst] QLineEdit eingabe beschränken

Verfasst: 15. Mai 2006 23:23
von Whitefurrows
Hallo,

auf einem QWidget habe ich 10 QLineEdit’s. Diese sind in zwei Gruppen je 5 stück angeordnet. Es soll folgendes möglich sein:

Grupp1:
Eingabe von 1-10 möglich (zwei Nachkommastellen)
Es darf bei einer Addition der 5 Felder von Gruppe1 einen maximalwert von 10 ergeben.

Beispiel:
Feld1 = 10 (keine weitere Eingabe möglich)

Feld1 = 4 (jetzt nur noch Eingabe 0-6 möglich)
Feld2 = 3 (jetzt nur noch Eingabe 0-3 möglich)
Feld3 = 3 (keine weitere Eingabe möglich)

Das gleiche gilt für Gruppe2, nur das anfangs Eingaben von 0-16 möglich sind.

Kann man das evtl. mit QregExp und einer kleinen schleife erledigen, so das nach einer neuen Eingabe bei allen QLineEdit’s eine neue QregExp gesetzt wird, damit es erst gar nicht möglich ist einen höheren Wert einzugeben, als erlaubt.

Wenn ja wie sieht das ganze dann aus? Hat vielleicht jemand eine bessere Idee?

Gruß

Whitefurrows

Verfasst: 16. Mai 2006 07:32
von macman
Alle LineEdits bekommen einen QDoubleValidator. Connecte deine LineEdits alle mit einem Slot textChanged() und dort kannst Du entsprechend den Eingaben den Validator setzen.

Verfasst: 16. Mai 2006 13:06
von Whitefurrows
OK, so kann ich den QDoubleValidator setzen und Connecte die LineEdits

QList<QLineEdit *> textList= this->findChildren<QLineEdit *>();
for (int i=0;i<textList.size();i++){
textList->setValidator(new QDoubleValidator( 1.00, 10.00, 2, textList));
connect (textList, SIGNAL(textChanged(const QString&)), this, SLOT (setValidator()) );
}

Wie kann ich aber jetzt in setValidator() den entsprechenden Validator setzen und wie sieht dieser aus?

Verfasst: 16. Mai 2006 14:19
von macman
Whitefurrows hat geschrieben:Wie kann ich aber jetzt in setValidator() den entsprechenden Validator setzen und wie sieht dieser aus?
Der Validator ändert sich mit jeder Eingabe. Je nach dem was eingeben wurde, musst Du die Validatoren der Felder, in denen noch nichts steht, anpassen. Einen Validator, der dir die Berechnungen abnimmt, gibt es nicht, ausser Du schreibst Dir einen.

Verfasst: 16. Mai 2006 15:51
von Whitefurrows
Den Validator kann ich doch nicht erst in setValidator setzen, da wurde ja evtl. schon eine falsche Eingabe gemacht.

Wie kann ich beim auswählen des LineEdits den Validator setzen?

Verfasst: 16. Mai 2006 16:09
von macman
Erstmal bekommen alle LineEdits einen Validator von 0-10. Jetzt gibst Du im ersten LineEdit 7 ein, dann bekommen alle LineEdits, die noch leer sind, einen Validator 0-3. Interessant wird es wenn Du im ersten 7 eingibst, im 2. 2 und dann den ersten auf 5 änderst. Dann könntest Du im 2. trotzdem nur bis 3 eingeben. Das zu verhindern wird etwas Fummelei, aber einen anderen Weg sehe ich auf die Schnelle nicht.

Verfasst: 20. Mai 2006 16:46
von Whitefurrows
Hallo,

vielen Dank für deine Hilfe.

Falls es jemand interessiert. Den Validator kann man so setzen:

Code: Alles auswählen

class MyDoubleValidator : public QDoubleValidator
{
public:
	MyDoubleValidator( double bottom, double top, int decimals, QObject* parent = 0)
		: QDoubleValidator( bottom, top, decimals, parent)
	{}
 
	QValidator::State validate(QString & input, int &) const
	{
		const double b = bottom();
		const double t = top();
		const int d = decimals();

		QRegExp empty(QString::fromLatin1("-?\\.?"));
		if (input.contains(' '))
			return Invalid;
		if (b >= 0 && input.startsWith(QLatin1Char('-')))
			return Invalid;
		if (empty.exactMatch(input))
			return Intermediate;

		double entered = input.toDouble();
		int nume = input.count('e', Qt::CaseInsensitive);

		int i; //int i = input.indexOf('.');
		if (input.contains(','))
			i = input.indexOf(',');
		else
			i = input.indexOf('.');
	
		if (i >= 0 && nume == 0) {
			i++;
			int j = i;
			while(input[j].isDigit())
				j++;
			if (j - i > d)
				return Invalid;
		}

		if (entered < b || entered > t)
			return Invalid;

		return Acceptable;			
	}
}; 

lineEdit->setValidator(new MyDoubleValidator( 1, 10, 2, lineEdit]));
Wenn jemand eine einfachere Möglichkeit kennt, darf er gern bescheid sagen ;-)

Gruß

Whitefurrows