Results 1 to 20 of 30

Thread: QLineEdit set min max range?

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    5,372
    Thanks
    28
    Thanked 976 Times in 912 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QLineEdit set min max range?

    Then use QDoubleValidator or QRegExpValidator (regexp should be something like "(?:1[0-5]|[1-9])(?:[.,]\\d\\d?)?|16(?:[.,]00?)?").

  2. The following user says thank you to jacek for this useful post:

    whitefurrows (10th June 2006)

  3. #2
    Join Date
    May 2006
    Posts
    108
    Thanks
    35
    Thanked 2 Times in 1 Post
    Qt products
    Qt4
    Platforms
    Windows

    Question Re: QLineEdit set min max range?

    Hi,

    that's great your regexp work fine. I read the doc for QRegExp but i dont know what you do. Can you describe how your regexp work and i understand that. The problem is i have many other ranges to set e.g. 0-50, 15-32, 65-105 and i can't change your regexp.

    How can i set a QDoubleValidator its's easey, but my code don't work. I can set values out of range. Why?
    Qt Code:
    1. lineEdit->setValidator(new QDoubleValidator( 1.00, 16.00, 2, lineEdit));
    To copy to clipboard, switch view to plain text mode 

    Greetings,

    Whitefurrows

  4. #3
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    5,372
    Thanks
    28
    Thanked 976 Times in 912 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QLineEdit set min max range?

    Quote Originally Posted by whitefurrows
    Can you describe how your regexp work and i understand that. The problem is i have many other ranges to set e.g. 0-50, 15-32, 65-105 and i can't change your regexp.
    In such case, IMO, it would be better if you create your own validator class, because regexps aren't very readable.

    Anyway, suppose you want a regexp for 65-105 range. Valid numbers are:
    65, 66, 67, 68, 69, 70, ..., 79, 80, ..., 89, 90, ..., 99, 100, 101, 102, 103, 104, 105

    There are three possibilities:
    • 6 and one of {5, 6, 7, 8, 9} -> 6[5-9]
    • one of {7, 8, 9} and a digit -> [7-9]\\d
    • 10 and one of {0, 1, 2, 3, 4, 5} -> 10[0-5]

    and you just have to join them: 6[5-9]|[7-9]\\d|10[0-5]

    Quote Originally Posted by whitefurrows
    How can i set a QDoubleValidator its's easey, but my code don't work. I can set values out of range. Why?
    Because you can enter 1500.00e-2, which is a valid number.
    Last edited by jacek; 21st May 2006 at 16:28. Reason: fixed a typo

  5. The following user says thank you to jacek for this useful post:

    whitefurrows (10th June 2006)

  6. #4
    Join Date
    May 2006
    Posts
    108
    Thanks
    35
    Thanked 2 Times in 1 Post
    Qt products
    Qt4
    Platforms
    Windows

    Question Re: QLineEdit set min max range?

    OK i have understand how work the regexp, thank you.

    I think really it's better to write my own validator class.

    Qt Code:
    1. class myDoubleValidator : public QDoubleValidator
    2. {
    3. public:
    4. myDoubleValidator( double bottom, double top, int decimals, QObject* parent = 0)
    5. : QDoubleValidator( bottom, top, decimals, parent){}
    6.  
    7. QValidator::State validate ( QString & input, int &pos ) const
    8. {
    9. if ( input.isEmpty() || input == "." )
    10. return Intermediate;
    11. //I'm not sure what can i do here
    12. return Invalid;
    13. }
    14.  
    15. return Acceptable;
    16. }
    17. };
    To copy to clipboard, switch view to plain text mode 

    Can you help me please?

  7. #5
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    5,372
    Thanks
    28
    Thanked 976 Times in 912 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QLineEdit set min max range?

    Take a look at QDoubleValidator::validate() implementation (it's in %QTDIR%/src/gui/widgets/qvalidator.cpp). All you have to do is to remove the part that handles the exponent.

  8. The following user says thank you to jacek for this useful post:

    whitefurrows (10th June 2006)

  9. #6
    Join Date
    May 2006
    Posts
    108
    Thanks
    35
    Thanked 2 Times in 1 Post
    Qt products
    Qt4
    Platforms
    Windows

    Question Re: QLineEdit set min max range?

    I don't want change orginal files. I try this:

    Qt Code:
    1. class MyDoubleValidator : public QDoubleValidator
    2. {
    3. public:
    4. MyDoubleValidator( double bottom, double top, int decimals, QObject* parent = 0)
    5. : QDoubleValidator( bottom, top, decimals, parent)
    6. {}
    7.  
    8. QValidator::State QDoubleValidator::validate(QString & input, int &) const
    9. {
    10. QRegExp empty(QString::fromLatin1("-?\\.?"));
    11. if (input.contains(' '))
    12. return Invalid;
    13. if (b >= 0 && input.startsWith(QLatin1Char('-')))
    14. return Invalid;
    15. if (empty.exactMatch(input))
    16. return Intermediate;
    17. bool ok = true;
    18. double entered = input.toDouble(&ok);
    19. int nume = input.count('e', Qt::CaseInsensitive);
    20. if (!ok) {
    21. // explicit exponent regexp
    22. QRegExp expexpexp(QString::fromLatin1("[Ee][+-]?(\\d*)$"));
    23. int eePos = expexpexp.indexIn(input);
    24. if (eePos > 0 && nume == 1) {
    25. QString mantissa = input.left(eePos);
    26. entered = mantissa.toDouble(&ok);
    27. if (!ok)
    28. return Invalid;
    29. if (expexpexp.cap(1).isEmpty())
    30. return Intermediate;
    31. } else if (eePos == 0) {
    32. return Intermediate;
    33. } else {
    34. return Invalid;
    35. }
    36. }
    37.  
    38. int i = input.indexOf('.');
    39. if (i >= 0 && nume == 0) {
    40. // has decimal point (but no E), now count digits after that
    41. i++;
    42. int j = i;
    43. while(input[j].isDigit())
    44. j++;
    45. if (j - i > d)
    46. return Intermediate;
    47. }
    48.  
    49. if (entered < b || entered > t)
    50. return Intermediate;
    51. return Acceptable;
    52. }
    53. };
    To copy to clipboard, switch view to plain text mode 

    but i can't compile!
    Last edited by whitefurrows; 21st May 2006 at 16:18.

  10. #7
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    5,372
    Thanks
    28
    Thanked 976 Times in 912 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QLineEdit set min max range?

    Quote Originally Posted by whitefurrows
    I try this:
    You're on the right track.

    It should be:
    Qt Code:
    1. class MyDoubleValidator : public QDoubleValidator
    2. {
    3. public:
    4. MyDoubleValidator( double bottom, double top, int decimals, QObject* parent = 0)
    5. : QDoubleValidator( bottom, top, decimals, parent)
    6. {}
    7.  
    8. QValidator::State validate(QString & input, int &) const
    9. {
    10. // we don't have the access to private members of QDoubleValidator,
    11. // so we must simulate them:
    12. const double b = bottom();
    13. const double t = top();
    14. const int d = decimals();
    15.  
    16. QRegExp empty(QString::fromLatin1("-?\\.?"));
    17. if (input.contains(' '))
    18. return Invalid;
    19. ...
    20. }
    21. };
    To copy to clipboard, switch view to plain text mode 

  11. The following user says thank you to jacek for this useful post:

    whitefurrows (10th June 2006)

  12. #8
    Join Date
    May 2006
    Posts
    108
    Thanks
    35
    Thanked 2 Times in 1 Post
    Qt products
    Qt4
    Platforms
    Windows

    Thumbs up Re: QLineEdit set min max range?

    Hi,

    that's work fine. Thank you for your great help.

    Greetings,

    Whitefurrows

  13. #9
    Join Date
    May 2006
    Posts
    108
    Thanks
    35
    Thanked 2 Times in 1 Post
    Qt products
    Qt4
    Platforms
    Windows

    Question Re: QLineEdit set min max range?

    Hi,

    sorry i have trouble with my own QDoubleValidator, i set a Range 5-25 but i can't type 15 in to the QLineEdit:
    myLineEdit->setValidator(new MyDoubleValidator( 5, 25, 2, myLineEdit));

    Can anybody help me?

    Greetings,

    Whitefurrows

    Qt Code:
    1. class MyDoubleValidator : public QDoubleValidator
    2. {
    3. public:
    4. MyDoubleValidator( double bottom, double top, int decimals, QObject* parent = 0)
    5. : QDoubleValidator( bottom, top, decimals, parent){}
    6.  
    7. QValidator::State validate(QString & input, int &) const
    8. {
    9. const double b = bottom();
    10. const double t = top();
    11. const int d = decimals();
    12.  
    13. QRegExp empty(QString::fromLatin1("-?\\.?"));
    14. if (input.contains(' '))
    15. return Invalid;
    16. if (b >= 0 && input.startsWith(QLatin1Char('-')))
    17. return Invalid;
    18. if (empty.exactMatch(input))
    19. return Intermediate;
    20.  
    21. bool ok = false;
    22. double entered = input.toDouble(&ok);
    23. if (!ok) return Invalid;
    24.  
    25. int nume = input.count('e', Qt::CaseInsensitive);
    26.  
    27. int i;
    28. if (input.contains(','))
    29. i = input.indexOf(',');
    30. else
    31. i = input.indexOf('.');
    32.  
    33. if (i >= 0 && nume == 0) {
    34. i++;
    35. int j = i;
    36. while(input[j].isDigit())
    37. j++;
    38. if (j - i > d)
    39. return Invalid;
    40. }
    41.  
    42. if (entered < b || entered > t)
    43. return Invalid;
    44.  
    45. return Acceptable;
    46. }
    47. };
    To copy to clipboard, switch view to plain text mode 

  14. #10
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    5,372
    Thanks
    28
    Thanked 976 Times in 912 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QLineEdit set min max range?

    The problem is here:
    Qt Code:
    1. if (entered < b || entered > t)
    2. return Invalid;
    To copy to clipboard, switch view to plain text mode 
    If the allowed range is 5--25, then "1" should be an intermediate value, not invalid one.
    It should be probably:
    Qt Code:
    1. if( entered < b ) {
    2. return Intermediate;
    3. }
    4. else if( entered > t ) {
    5. return Invalid;
    6. }
    To copy to clipboard, switch view to plain text mode 

  15. The following user says thank you to jacek for this useful post:

    whitefurrows (10th June 2006)

  16. #11
    Join Date
    May 2006
    Posts
    108
    Thanks
    35
    Thanked 2 Times in 1 Post
    Qt products
    Qt4
    Platforms
    Windows

    Question Re: QLineEdit set min max range?

    Hi,

    sorry i don't have get a notification. That's right, but the user can put wrong values to the QLineEdit.

    What can i do?

    Greetings,

    Whitefurrows

  17. #12
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    5,372
    Thanks
    28
    Thanked 976 Times in 912 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QLineEdit set min max range?

    Quote Originally Posted by whitefurrows
    That's right, but the user can put wrong values to the QLineEdit.
    The problem is that line edit can loose focus when it contains an intermediate value. IMO you should ask the Trolls whether this is a correct behavior.

  18. The following user says thank you to jacek for this useful post:

    whitefurrows (10th June 2006)

Similar Threads

  1. Replies: 10
    Last Post: 12th February 2009, 07:23
  2. QLineEdit
    By rick_st3 in forum Newbie
    Replies: 1
    Last Post: 14th June 2008, 09:05
  3. Pointer Question related to QLineEdit
    By ChrisReath in forum Qt Programming
    Replies: 1
    Last Post: 23rd May 2008, 15:13
  4. QValidator, regular expressions and QLineEdit
    By hvengel in forum Qt Programming
    Replies: 1
    Last Post: 8th August 2007, 01:25
  5. Qt and MySQL Database Connection
    By shamik in forum Qt Programming
    Replies: 41
    Last Post: 6th October 2006, 12:48

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Qt is a trademark of The Qt Company.