「C++ Qt6 开发」QChar 常用功能测试

1 QChar

1.1 QChar 简介

QChar 是 Qt 框架中的一个类,用于表示 Unicode 字符。它是 Qt 字符处理的基础,类似于 C++ 中的 char 或 wchar_t,但不同的是,QChar 类内部用 2 个字节 的 Unicode 编码来表示一个字符。

1.2 QChar 功能

下面为你介绍Qt中QChar类的主要接口函数及其功能:

函数原型 功能描述
构造函数
QChar() 默认构造函数,创建一个空字符(即Unicode值为0的字符)。
QChar(ushort code) 通过Unicode码点值构造字符。
QChar(char16_t code) 通过UTF-16码点构造字符(C++11及以上)。
QChar(char32_t code) 通过UTF-32码点构造字符(C++11及以上)。
属性判断
bool isNull() const 判断字符是否为空(Unicode值为0)。
bool isSpace() const 判断字符是否为空白字符(如空格、制表符、换行符等)。
bool isDigit() const 判断字符是否为数字(‘0’-‘9’)。
bool isLetter() const 判断字符是否为字母。
bool isLetterOrNumber() const 判断字符是否为字母或数字。
bool isUpper() const 判断字符是否为大写字母。
bool isLower() const 判断字符是否为小写字母。
bool isPrint() const 判断字符是否为可打印字符。
大小写转换
QChar toUpper() const 返回字符的大写形式。
QChar toLower() const 返回字符的小写形式。
bool toUpper() 将字符转换为大写形式,成功返回true。
bool toLower() 将字符转换为小写形式,成功返回true。
编码转换
ushort unicode() const 返回字符的Unicode码点值。
char toLatin1() const 返回字符的Latin-1(ISO 8859-1)表示,超出范围时返回0。
QString toUcs4() const 返回字符的UCS-4表示(作为单元素的QString)。
比较操作
bool operator==(QChar other) const 判断两个字符是否相等。
bool operator!=(QChar other) const 判断两个字符是否不相等。
bool operator<(QChar other) const 比较两个字符的Unicode值大小。
其他功能
static QChar fromLatin1(char c) 从Latin-1字符创建QChar对象。
static QChar fromUcs4(uint code) 从UCS-4码点创建QChar对象(处理超出基本多文种平面的字符)。
QString toString() const 将字符转换为单字符的QString。

2 QChar 功能测试

2.1 显示字符串每个字符的 unicode

slot 函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
void Widget::on_btnGetChars_clicked()
{
QString str = ui -> editStr -> text();
if(str.isEmpty()) return;
for(qint16 i = 0; i < str.size(); i ++ )
{
QChar ch = str.at(i);
char16_t uni = ch.unicode();
QString chStr(ch);
QString info = chStr + QString::asprintf("\t, Unicode = 0x%X", uni);
ui -> plainTextEdit -> appendPlainText(info);
}
}


2.2 显示单个字符的特性

slot 函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Widget::on_btnCharJudge_clicked()
{
QString str = ui -> editChar -> text();
if(str.isEmpty()) return;

QChar ch = str.at(0);
char16_t uni = ch.unicode();

QString info = str + QString::asprintf("\t, Unicode = 0x%X", uni);
ui -> plainTextEdit -> appendPlainText(info);

ui -> chkDigit -> setChecked(ch.isDigit());
ui -> chkLetter -> setChecked(ch.isLetter());
ui -> chkLetterNum -> setChecked(ch.isLetterOrNumber());
ui -> chkUpper -> setChecked(ch.isUpper());
ui -> chkLower -> setChecked(ch.isLower());
ui -> chkMark -> setChecked(ch.isMark());
ui -> chkSpace -> setChecked(ch.isSpace());
ui -> chkSymbol -> setChecked(ch.isSymbol());
ui -> chkPunct -> setChecked(ch.isPunct()); // 是否为标点符号
}


2.3 QChar 字符与 Latin1 字符的转换

Latin1(ISO 8859-1) 是单字节编码,覆盖 0-255 的字符范围,包含基本 ASCII(0-127)和扩展西欧字符(128-255)。

  • QChar 转换为 Latin1

    char toLatin1() const 返回QChar的 Latin1 表示。若字符超出 Latin1 范围(0-255),返回’\0’(值为 0)。

    1
    2
    3
    4
    5
    6
    7
    QChar c1 = 'A';         // Unicode 65 → Latin1 65 ('A')
    QChar c2 = QChar(225); // Unicode 225 (ε) → Latin1 225 (α)
    QChar c3 = QChar(1000); // 超出Latin1范围 → 返回 '\0'

    char latin1_c1 = c1.toLatin1(); // 'A'
    char latin1_c2 = c2.toLatin1(); // 'α'
    char latin1_c3 = c3.toLatin1(); // '\0'
  • Latin1 转换为 QChar

    1
    2
    3
    4
    5
    char latinChar = 'B';      // ASCII 'B' (66)
    QChar unicodeChar = QChar::fromLatin1(latinChar); // Unicode 66 ('B')

    char extendedChar = 233; // Latin1 233 (é)
    QChar accentedChar = QChar::fromLatin1(extendedChar); // Unicode 233 (é)

功能测试 slot 函数如下:

1
2
3
4
5
6
7
8
void Widget::on_btnLatin_clicked()
{
QString str = "Marisa";
ui -> plainTextEdit -> appendPlainText(str);
QChar ch = QChar::fromLatin1('A');
str.back() = ch;
ui -> plainTextEdit -> appendPlainText("\n" + str);
}


2.4 QChar 字符与 UTF-16 字符的转换

QChar 是用于表示 Unicode 字符的类,内部使用 UTF-16 编码。

  • QChar 对应一个 UTF-16 编码单元(16 位值)。

  • Unicode 字符分两种情况:

    • BMP 字符(码位 ≤ 0xFFFF):1 个 QChar 表示。

    • 非 BMP 字符(码位 > 0xFFFF,如表情符号):需 2 个 QChar(代理对)。

  • 数值 → QChar

    1
    2
    ushort utf16Value = 0x4E2D;  // "中" 的 UTF-16 编码
    QChar ch(utf16Value); // 直接构造
  • QChar → 数值

    1
    ushort value = ch.unicode();  // 获取 UTF-16 编码值
  • 代理对转换(非 BMP 字符)

    • 32 位码位 → 代理对(两个 QChar
    1
    2
    3
    4
    5
    6
    7
    8
    9
    uint codePoint = 0x1F600; // 😀 的码位

    // 检查是否需要代理对
    if (codePoint > 0xFFFF) {
    QChar high = QChar::highSurrogate(codePoint); // 高代理
    QChar low = QChar::lowSurrogate(codePoint); // 低代理
    QString str;
    str.append(high).append(low); // 组合成字符串
    }
    • 代理对 → 32 位码位
    1
    2
    3
    4
    5
    6
    7
    8
    QString str = u"😀"; // 包含两个 QChar(代理对)
    if (str.length() == 2) {
    QChar high = str[0];
    QChar low = str[1];
    if (high.isHighSurrogate() && low.isLowSurrogate()) {
    uint codePoint = QChar::surrogateToUcs4(high, low); // 0x1F600
    }
    }

功能测试 slot 函数如下:

1
2
3
4
5
6
7
8
9
10
11
void Widget::on_btnUTF16_clicked()
{
QString str = "魔理沙";
ui -> plainTextEdit -> appendPlainText(str);
QString tmp = "爱丽丝";
for(qint16 i = 0; i < tmp.size(); i ++ ){
char16_t uni = tmp.at(i).unicode();
str[i] = QChar(uni);
}
ui -> plainTextEdit -> appendPlainText("\n" + str);
}


2.5 QChar 字符的比较和替换

QChar支持标准比较运算符,基于 Unicode 码点值进行比较:

1
2
3
4
5
6
7
QChar c1('A');
QChar c2('B');
QChar c3('A');

bool equal = (c1 == c3); // true(码点均为65)
bool notEqual = (c1 != c2); // true
bool lessThan = (c1 < c2); // true('A'码点65 < 'B'码点66)

功能测试 slot 函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Widget::on_btnCmp_clicked()
{
QString str = "爱丽丝";
ui -> plainTextEdit -> appendPlainText(str);
QString tmp = "爱魔";
QChar ai = QChar::fromUcs2(tmp.at(0).unicode());
QChar mo = QChar(tmp.back().unicode());
for(qint16 i = 0; i < str.size(); i ++ ){
if(str.at(i) == ai){
str[i] = mo;
}
}
ui -> plainTextEdit -> appendPlainText("\n" + str);
}


参考

《Qt 6 C++ 开发指南》


「C++ Qt6 开发」QChar 常用功能测试
https://marisamagic.github.io/2025/07/24/20250723/
作者
MarisaMagic
发布于
2025年7月24日
许可协议