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
[gelöst] QLineEdit eingabe beschränken
-
Whitefurrows
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
[gelöst] QLineEdit eingabe beschränken
Zuletzt geändert von Whitefurrows am 21. Mai 2006 21:50, insgesamt 1-mal geändert.
-
Whitefurrows
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
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?
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.
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 hat geschrieben:Wie kann ich aber jetzt in setValidator() den entsprechenden Validator setzen und wie sieht dieser aus?
-
Whitefurrows
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
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
Hallo,
vielen Dank für deine Hilfe.
Falls es jemand interessiert. Den Validator kann man so setzen:
Wenn jemand eine einfachere Möglichkeit kennt, darf er gern bescheid sagen 
Gruß
Whitefurrows
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]));
Gruß
Whitefurrows