Własny validator w Qt

Własny validator w Qt
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 lat
  • Postów:110
0

Hm.. coś nie mogę sobie poradzić z przygotowaniem własnego validatora, pomimo iż mam przykład od @MarekR22 wyłożony na tacy :( (link: http://4programmers.net/Forum/C_i_C++/222411-walidacja_danych_w_lineeditach )

Może pokaże co mam:
(jest to coś eksperymentalny kod, ponieważ nie mogę załapać "tematu", dlaczego (albo jak to zrobić?) po wywołaniu fixup nie "odświeża" mi wartości w poprzednim QLineEdit .. )

edit//
dodane: input = final;

Kopiuj
class Validator : public QValidator
{
    Q_OBJECT

public:
    Validator(QObject * parent = 0);
    Validator::State validate(QString &str, int &pos) const;
    void fixup(QString &str) const;
};

Validator::Validator(QObject * parent) :
    QValidator(parent)
{
}

QValidator::State Validator::validate(QString &input, int &pos) const
{

    if (input.isEmpty())
            return Acceptable;

        quint16 i = input.toInt();
        qDebug() << i;
        if ((i < 1 || i > 5))
            return Intermediate;

        return Acceptable;
}

void Validator::fixup(QString &input) const
{

    QString final;

        for (int i = 0; i < input.length(); ++i) {
            QChar c = input.at(i);
            qDebug() << c;
            if (c.isDigit())
                 final += c;
        }
        input += locale().toString(9);
        input = final;
}

podsumowując: co mam dodać, aby odświeżać wartość w QLineEdit po wywołaniu fixup (z tego przykładu od @MarekR22 (nie wiedząc czemu .. ) nie mogę tego zlokalizować..)

edytowany 3x, ostatnio: mikajlo
HO
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 lat
  • Postów:283
0

QString final ma być poprawioną wersją input? Jeśli tak to input = final pod koniec metody powinno zostać zawołane.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go. Pozdrawiam
Zobacz pozostałe 5 komentarzy
HO
Patrzę w dokumentację QValidator i chyba fixup będzie wołane ale w momencie gdy validate zwróci Invalid.
MI
hm.. wydaje się, że fixup wywoływane jest zarówno dla Intermediate jak i Invalid.. (ale nadal pomimo wywoływania funkcji fixup nie jest "odświeżany" dany lineEdit :/ ). Powiem szczerze, że mam sporo innych "zagadek" i nie mam za bardzo czasu więcej testować (swoją drogą brak mi pomysłu..).. dlatego czekam na wypowiedzi innych osób znających Qt framework.. Może wspomniany przeze mnie @MarekR22 dałby jakąś wskazówkę .. ;>
HO
Może napisz jaki dajesz input i jaki ma byc output. Sprawdziłem u siebie i fixup odpala się przy Intermediate, więc przypuszczam, że fixup masz źle napisany.
MI
hm.. w sumie testowałem zarówno kod wpisany w pierwszym poście jak i jego wariancje (metodą prób i błędów..). To może być wrzucił swój kod, który u Ciebie działa poprawnie ?
HO
Napisz co chcesz osiągnąć - u mnie też nie działa ale przez to, że na mój gust masz zły kod. Fixup powinien zwrócić tekst który będzie Acceptable a u Ciebie tego zdaje się nie robi i dlatego nie widać zmian.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:4 minuty
0

po pierwsze opisz co szczególnego ma ten twój validator. jak na razie nie widzę by miał coś więcej niż QIntValidator, a na pewno jest uboższy.
po drugie co właściwie ma robić ten fixup? W zasadzie cyfra po cyfrze robisz kopię tego co dostałeś, przy czym przedostatnia linijka: input += locale().toString(9); nie robi nic, bo następna linijka anuluje jej efekt, na dodatek wygląda bezsensu.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
MI
Wiem, że ten validator nic nie robi, ale chciałem zacząć od "widocznych" efektów i prostego przykładu, do którego nie mogę dojść... Powołałem się na Twój wcześniej post i w sumie chciałem np. zrobić takie coś, że jak 'wychodzę' z danego QLineEdit'a doda mi literkę p, czyli wpisuje 5 i otrzymuje 5p.
MarekR22
no to napisałem co jest źle. Zmień ostatnie dwie linijki na: input = '0'+final;. Pamiętaj, że by fixup i validate były konsystentne, to poprawka wprowadzona przez fixup podana do validate powinna dać wynik Acceptable inaczej możesz mięć dziwne efekty uboczne (już nie pamiętam co się wtedy złego dzieje).
MI
Hm.. chyba dam sobie spokój z tą walidacją.. Cały czas mi to nie odpala a ja chyba jestem za cienki aby to od podstaw zrobić.. Sprawdzałem również jakiś znaleziony przykład z neta ale też nic mi on nie walidował.. Najwidoczniej nie jest mi dane .. :P (ale szacun za chęć pomocy..)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.