Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Forbid caracters which aren't numerical in a QStandardItemModel



  • Hello,

    there's any tool which allow to forbid the use of caracters which aren't numerical in a QStandardModel? Or a tool which has a similar purpose? I looked the doc but didn't find what i mean.





  • The problem is that the model will only get the modified text when the editor indicates that it's done. It would suprise users if the alphanumerical characters would suddenly disapear, i think. Instead, perhaps you should solve the issue at the delegate level: the level that presents the editor for the data.



  • Thanks you, i will try



  • At the delegate, you should reimplement the createEditor method, return a [[Doc:QLineEdit]] (if that's the correct widget) and add a [[Doc:QValidator]] subclass to the line edit. That prevents the user from entering the wrong characters at all. l would start with a [[Doc:QRegExpValidator]].



  • Hello,

    thanks you for your help, I reimplemented the createEditor method :

    @
    QWidget* MyView::MyDelegate::createEditor ( QWidget * parent,
    const QStyleOptionViewItem & option,
    const QModelIndex & index ) const
    {
    QLineEdit* lineEdit = new QLineEdit(parent);
    QRegExp regex = QRegExp(QString::fromStdString("\d+"));
    lineEdit->setValidator(new QRegExpValidator(regex, NULL));

    return lineEdit;
    

    }@

    It works perfectly when the cell is empty, i.e I can't write characters no-numerical but if the cell contains anything and I try to edit it, I can write alphanumerical characters. I don't understand what happened ! Does the setItem() method modify the delegate?

    [Edit: Cleaned up code formatting; mlong]


  • Moderators

    try
    @
    QRegExp regex = QRegExp(QString::fromStdString("^\d+$"));
    @

    As it currently stands, 345X123Y still matches the regexp because it matches the substrings 345 and 123. But by putting the ^ and $ anchors into the regexp, it will force the regexp to match an entire string of nothing but digits.



  • Unfortunately, the problem still the same :

    • if I edit an empty cell, I can't put any alphabetic character
    • but if I try to modify a full cell I can !

    I don't understand. Perhaps the number setted in the cell by the setItem method is not considered to match the regex and it's why the delegate doesn't react.


  • Moderators

    The validators only validate against manually-entered data (see the note "here":/doc/qt-4.8/qlineedit.html#text-prop .) If you want to filter anything that is being programatically entered, you'll need to check that data itself before you try to set it.



  • But I set data in my program and they are numerical. I don't understand why when I try to edit one I can write alphabetic characters. In this case, the validator doesn't work correctly.


Log in to reply