[gelöst] QLineEdit eingabe beschränken

Alles rund um die Programmierung mit Qt
Antworten
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

[gelöst] QLineEdit eingabe beschränken

Beitrag 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
Zuletzt geändert von Whitefurrows am 21. Mai 2006 21:50, insgesamt 1-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag 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?
Zuletzt geändert von Whitefurrows am 21. Mai 2006 20:29, insgesamt 2-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag 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?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag 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
Antworten