进qq空间上面没有网站上海搜索关键词排名
setMaxLength(int)只能用来限制输入的字符个数
QLineEdit *editor = new QLineEdit(parent);
editor->setMaxLength(32);
1、如果是单字节字符,如数字,字母等,字符数正好等于字节数
2、如果是多字节字符,UTF8编码时,汉字一般占用3个字节,GBK编码时,汉字占用2个字节。
UTF-8 编码简介
UTF-8 是一种变长编码,可以表示 Unicode 字符集中的所有字符。UTF-8 中字符的长度可以从1到4个字节不等:
单字节字符(ASCII字符):以 0xxxxxxx 开头。
多字节字符:
第一个字节(起始字节)以 110xxxxx、1110xxxx 或 11110xxx 开头,表示接下来还有多少个延续字节。
延续字节(后续字节)都以 10xxxxxx 开头。
有时候我们想根据字节数对输入框禁止截断,超过32字节就不显示或者禁止输入
输入框内可以输入英文、数字和汉字以及其它字符
如果我们只设置setMaxLength(32),可以输入32个汉字,32个汉字明显不等于32个字节
QString truncateToByteLimit(const QString &text, int maxBytes)//对UTF8编码的汉字或者单字符截断
{QByteArray utf8Text = text.toUtf8();if (utf8Text.size() <= maxBytes){return text;}// 截断到指定的最大字节数,确保不破坏字符int byteCount = 0;for (int i = 0; i < utf8Text.size(); ++i){byteCount++;// 检查是否是多字节字符的开始,并且是否已经达到了最大字节数,非单字节if ((utf8Text[i] & 0xC0) != 0x80 && byteCount >= maxBytes && (utf8Text[i] & 0x80) != 0){// 如果当前字节不是延续字节并且超过了最大字节数,则在此处截断return QString::fromUtf8(utf8Text.left(i));}else if((utf8Text[i] & 0xC0) == 0x80 && byteCount >= maxBytes)//延续字符{if((utf8Text[i-1] & 0xC0) != 0x80 && i>0 && (utf8Text[i-1] & 0x80) != 0)//开始字符{return QString::fromUtf8(utf8Text.left(i-1));}else if( i>0 && (utf8Text[i-1] & 0x80) == 0)//单字符,这种情况可以不用判断{return QString::fromUtf8(utf8Text.left(i));}}else if((utf8Text[i] & 0x80) == 0 && byteCount > maxBytes)//单字符{return QString::fromUtf8(utf8Text.left(i));}}// 如果所有字符都符合限制,返回原始文本return QString::fromUtf8(utf8Text);
}
使用:绑定QLineEdit的信号textChanged(),并在槽函数进行处理
QByteArray QString::toUtf8() const 返回的是字符串所占用的字节数
connect(lineEditor, &QLineEdit::textChanged, [lineEditor](const QString &text) {if (text.toUtf8().size() > lineEditor->maxLength()) {// 如果超过限制,截断文本QString truncatedUtf8 = truncateToByteLimit(text,lineEditor->maxLength());lineEditor->setText(truncatedUtf8);}});