QUtf8ByteLimitValidator

From Qt Wiki
Jump to navigation Jump to search


QUtf8ByteLimitValidator is an example of a user-defined QValidator class which can be used in C++ and QML. This validator converts characters to UTF-8 byte array and checks if this byte array size exceeds value.

Class reference

Properties

  • int : length

This property defines the number of bytes. If text length in bytes exceeds this value, validation results in QValidator::Invalid otherwise validation results in QValidator::Acceptable. The validation of empty string results in QValidator::Intermediate.

Default value is: UINT_MAX

  • QString : prefix

Prefix is a case-insensitive property with which string begins with. The length of prefix is not not considered in a string validation.

Default value is: "" (empty)

  • bool : less

If less is false, validation will return QValidator::Acceptable only if string length is equal to length property, otherwise validation results in QValidator::Intermediate.

Default value is: true

Methods

static void declareQML()

Use this method in int main to declare QUtf8ByteLimitValidator class in QML.

Example (QML)

In the start of qml file:

    import QtUtf8ByteLimitValidator 1.0
    TextField {
        id: toxId
        font.pointSize: 32
        leftPadding: 10
        rightPadding: leftPadding
        verticalAlignment: TextInput.AlignVCenter
        width: parent.width
        text: ""
        validator: BytesValidator { length: bridge.getToxAddressSizeHex(); prefix: "tox:"; less: false }
        color: acceptableInput ? "black" : "red"
    }

Source code

#ifndef QTUTF8BYTELIMITVALIDATOR_H
#define QTUTF8BYTELIMITVALIDATOR_H
 
#include <QValidator>
#include <QQmlComponent>
 
class QUtf8ByteLimitValidator : public QValidator {
    Q_OBJECT
    Q_PROPERTY(int length READ getLength WRITE setLength)
    Q_PROPERTY(QString prefix READ getPrefix WRITE setPrefix)
    Q_PROPERTY(bool less READ getLess WRITE setLess)
public:
     explicit QUtf8ByteLimitValidator(QObject *parent = nullptr) : QValidator(parent) {
        m_length = UINT_MAX;
        m_prefix = "";
        m_less = true;
    }
    ~QUtf8ByteLimitValidator() {}
    QValidator::State validate(QString &input, int &) const
    {
        int prefix_length = 0;
        if (!m_prefix.isEmpty() && input.left(m_prefix.length()).toUpper() == m_prefix.toUpper()) {
            prefix_length = m_prefix.toUtf8().length();
        }
        QByteArray bytes = input.toUtf8();
        if (bytes.length() - prefix_length > m_length) {
            parent()->setProperty("acceptableInput", false);
            return QValidator::Invalid;
        }
        if (!m_less && bytes.length() - prefix_length < m_length) {
            parent()->setProperty("acceptableInput", false);
            return QValidator::Intermediate;
        }
        parent()->setProperty("acceptableInput", true);
        return QValidator::Acceptable;
    }
    void fixup(QString &) const {}
    static void declareQML() { qmlRegisterType<QUtf8ByteLimitValidator>("QtUtf8ByteLimitValidator", 1, 0, "BytesValidator"); }
 
    int getLength() { return m_length; }
    void setLength(int length) { m_length = length; }
    QString getPrefix() { return m_prefix; }
    void setPrefix(const QString &prefix) { m_prefix = prefix; }
    bool getLess() { return m_less; }
    void setLess(bool less) { m_less = less; }
private:
    Q_DISABLE_COPY(QUtf8ByteLimitValidator)
 
    int m_length;
    QString m_prefix;
    bool m_less;
};
 
#endif // QTUTF8BYTELIMITVALIDATOR_H