前言
使用QT进行开发的过程中,经常发现一些实用的小技巧,有时候能给开发带来不少便捷。因此,写下此文积累一些这方面的知识,便于自己查阅以及给广大开发者提供一些参考。
正文
1. QString与其他类型互转,以及格式化问题
1.1 整形转QString
10进制
int a = 100;
QString str = QString::number(a);
16进制
int a = 100;
QString str = QString::number(a, 16);
保留指定位数,不足补0,实现类似printf()函数的功能
// 输出"001"
int a=1;
QString str0 = QString::number(a).sprintf("%03d",a) // 方法1
QString str1 = QString("%1").arg(a, 3, 10, QChar('0')); // 方法2
1.2 QString转整形
QString num_str = "123";
int num = num_str.toInt(); // 10进制
QString hex_str = "30FF";
bool ret;
int num2 = hex_str.toInt(&ret, 16); // 16进制,第一个参数也可以填NULL
1.3 QString的截取
QString str = "abc123";
str.letf(2); // "ab"
str.right(4); // "c123"
str.mid(1, 3); // "bc1"
str.remove(0, 2); // "c123"
str.remove("abc"); // "123"
1.4 QString转char *
方法1:
QString qstr = "Hello, world!";
const char *cstr = qstr.toStdString().c_str();
方法2:
另一种方法是使用QString的toLocal8Bit()、toUtf8()、toLatin1()方法,将QString转换为QByteArray,然后使用QByteArray的date()方法获取char *。注意toLatin1()方法只适用于包含ASCII字符的字符串。对于包含非ASCII字符的字符串,这可能会导致数据损坏。
QString qstr = "Hello, world!";
QByteArray ba = qstr.toLocal8Bit(); // 或者使用 toUtf8()、toLatin1()
const char *cstr = ba.data();
方法3:
QString有一个toUtf8()方法,它返回一个QByteArray。然后,我们可以使用QByteArray的data()方法来获取一个指向字符数组的指针。
QString qstr = "Hello, world!";
char *cstr = qstr.toUtf8().data();
1.5 char *转QString
使用QString的构造函数,或者用fromUtf8()等方法,后者可以指定数据源的编码格式。
char cstr[] = "Hello";
QString qstr0 = QString(cstr);
QString qstr1 = QString::fromUtf8(cstr);
2. QByteArray与其他类型互转
2.1 quint8、char数组转QByteArray
调用QbyteArray的setRawDate方法
quint8 cmd_raw[9] = {0x55, 0xAA, 0x00, 0xA1, 0x00, 0x01, 0xC0, 0x82, 0xA5};
QByteArray cmd;
cmd.setRawData((char *)cmd_raw, sizeof(cmd_raw));
QString show = cmd.toHex().toUpper(); // 输出hex字符串形式,字母大写
也可使用构造函数
const char *c_str = "abc123";
QByteArray qa1(str); // 遇到'\0'即止
char u8_arr[3] = {0x11, 0x22, 0x33};
QByteArray qa2(u8_arr, 3);
2.2 QByteArray转quint8、char数组
直接调用data方法
QByteArray ba("123");
char *c_str = ba.data(); // 如需uint8_t可进行强制转换
2.3 QString转QByteArray
Hex格式string转QByteArry。
QString hexString = "112233AABB";
QByteArray ByteArray = QByteArray::fromHex(hexString.toLocal8Bit());
2.4 QByteArray转QString
如果QByteArray的内容是hex string,可以调用toHex()方法。
QByteArray byte_array;
QString hex_string = byte_array.toHex().toUpper(); // 十六进制,大写
如果QByteArray的内容是普通字符串,可以调用date()方法获得char *,然后调用QString()构造函数生成QString。
QByteArray byre_array;
QString qstr = QString(byre_array.data());
3. QTextEdit问题
3.1 文本编辑框和行编辑框强制英文输入法
有些场景下输入框只需要输入英文,如果输入中文则会引起错误,这个时候可以通过如下方法设置编辑框的属性,使之输入时强制系统输入法为英文输入法。
QTextEdit *te = new QTextEdit();
te->setAttribute(Qt::WA_InputMethodEnabled, false);