欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义QLineEdit,限制n个字符,一个中文相当于两个字符

程序员文章站 2022-04-06 08:23:00
...
#ifndef LINEEDIT_H
#define LINEEDIT_H

#include <QWidget>
#include<QLineEdit>

namespace Ui {
class LineEdit;
}
const unsigned DEFAULT_MAXCHARS = 10;
class LineEdit : public QLineEdit
{
    Q_OBJECT

public:
    explicit LineEdit(unsigned maxlen =DEFAULT_MAXCHARS, QWidget *parent = 0);
    void setMaxCharLen(unsigned len);
    ~LineEdit();
private:
    Ui::LineEdit *ui;
    unsigned m_uiLen;
private slots:
    void slotFilter(const QString &text);
};

#endif // LINEEDIT_H


#include "lineedit.h"
#include "ui_lineedit.h"

#include<QDebug>
#include<QRegExp>
#include<QKeyEvent>

LineEdit::LineEdit(unsigned maxlen, QWidget *parent) :
    m_uiLen(maxlen),
    QLineEdit(parent),
    ui(new Ui::LineEdit)
{
    ui->setupUi(this);
    setMaxLength(m_uiLen);
    connect(this,SIGNAL(textEdited(const QString &)),this,SLOT(slotFilter(const QString &)));
}

LineEdit::~LineEdit()
{
    delete ui;
}

void LineEdit::slotFilter(const QString &text)
{
    QString temp = text;
    unsigned num = 0;
    int i = 0;
    for(;i< temp.size();i++)
    {
        if(temp.at(i) >= 0x4e00 && temp.at(i) <= 0x9fa5)
        {
            if(num >= m_uiLen-1) break;
            num += 2;
        }
        else if(num < m_uiLen)
        {
            num += 1;
        }
        else{
            break;
        }
    }
    setText(temp.left(i));
}