QT的字符串类型
常用QString代替C++的String,QVariant可存放多种类型
语言 | 字符串类型 |
---|---|
c | char* |
c++ | string、char* |
QT | QByteArray、QString、QVariant |
QByteArray
c语言中
char*
的升级版本,其实就是对**char ***进行一次封装
常用的API
-
构造函数:
QByteArray::QByteArray(const char *data, int size = -1);
- 将data中的size个字符进行构造, 得到一个字节数组对象, size==-1 函数内部自动计算字符串长度。
-
数据操作:
-
尾部追加数据:append、push_back
-
头部追加数据:prepend、push_front
-
插入数据:insert
-
删除数据:remove、chpo、truncate、clear
-
从字符串中删除len个字符, 从第pos个字符的位置开始删除
QByteArray &QByteArray::remove(int pos, int len);
-
尾部删除 n 个字节
void QByteArray::chop(int n);
-
pos 位置将数组截断 (前边部分留下, 后边部分被删除)
-
void QByteArray::truncate(int pos);
-
-
-
字符串替换:before 替换 after
QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &after);
-
子字符串查找
- 是否包含子字符串:
bool QByteArray::contains(const QByteArray &ba) const;
- 是否以字符串开始:
bool QByteArray::startsWith(const QByteArray &ba) const;
- 是否以字符串结尾:
bool QByteArray::endsWith(const QByteArray &ba) const;
- 是否包含子字符串:
-
类型转换
- int, short, long, float, double -> QByteArray:
setNum
、number
- QByteArray -> int, short, long, float, double:
toInt
- string -> QByteArray:
fromStdString
- QByteArray -> string:
toStdString
- 转换为大写:
toUpper
- int, short, long, float, double -> QByteArray:
QString(常用)
QString:可以对QByteArray再进行一次封装,内部的编码为utf8
构造函数:
-
QString::QString(const char *str);
-
QString::QString(const QByteArray &ba);
常用API
-
数据操作:append、push_back、prepend、push_front、insert、remove
-
字符串替换:
replace(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
-
子字符串查找:contains、startsWith、endsWith
-
类型转换:同理
-
字符串格式化:
arg()
Qstring str = Qstring("(%1)有(%2)个徒弟,分别是(%3),(%4),(%5)").arg("唐僧").arg(3).arg("孙悟空").arg("猪八戒").arg("沙僧");
QByteArray与QString的区别
QString中可以通过arg函数进行动态拼接
计算字符串的长度不同
原因:QString采用的是UTF-8编码,则每个字符的长度都是一致的。而QByteArray没有改变 char* 的编码。
//计算对象中的字符串长度
// 长度是字符个数,一个汉字算一个字符
QString tmp ="我很帅呦,吼吼吼..", //len:12
// 长度是字符串占用的字节数,一个汉字3个字节
QByteArray tmp1 ="我很帅呦,吼吼吼..."; //len:26
QVariant
目的是对几种不同的数据类型进行传递。结构体不方便,容器则只能保存单一的数据类型。
QVariant 可以保存很多Qt的数据类型,包括
QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize、QString
,并且还有C++基本类型,如 int、float等。
构造函数:QVariant::QVariant(const QString &val);
常用API
-
设置函数也可以将支持的类型的数据设置到QVariant对象中:
-
void QVariant::setValue(const T &value);
-
QVariant QVariant::fromValue(const T &value);
QVariant v; v.setValue(5); //例子2 QVariant v = QVariant::fromValue(5); int i = v.toInt(); // i is now 5 QString s = v.toString(); // s is now "5"
-
-
判断 QVariant中封装的实际数据类型:
QVariant::type() const;
//传入QVariant两个参数,返回QVariant QVariant MainWindow::dataPlus(QVariant a, QVariant b) {OVariant ret;// 判断当前参数的类型是字符串还是整形数if(a.type()== QVariant::Int && b.type()== QVariant::Int)ret = QVariant(a.toInt()+ b.toInt()); }
-
将QVariant对象转换为实际的数据类型:
QString QVariant::toString() const;
自定义类型如何使用QVariant封装
自定义的类型也可以使用QVariant类进行封装, 被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用
Q_DECLARE_METATYPE()
宏。
- 先使用
Q_DECLARE_METATYPE(Type)宏
声明自定义类 - 通过两种转换方法转成QVariant(``setValue 和 fromValue`)
- 使用时通过
canConvert
判断是否为自定义类型 - 通过
value
提取出QVariant的值
// 自定义类型注册
Q_DECLARE_METATYPE(MyTest)
// 值的封装
QVariant vt = QVariant::fromValue(t);
// 值的读取
if(vt.canConvert<MyTest>())
{MyTest t = vt.value<MyTest>();qDebug() << "name: " << t.name << ", num: " << t.num;
}
// 如果当前QVariant对象可用转换为对应的模板类型 T, 返回true, 否则返回false
bool QVariant::canConvert() const;
// 将当前QVariant对象转换为实际的 T 类型
T QVariant::value() const;