文章目录
一、Qt的数据类型有那些?
QT的基础数据类型 点击这里查看
这里只是列举一些常用的,转换函数用法其实都是相似的,剩下的还是得自己翻文档罗。
二、QString与数字之间的转换:
1. QString转数字
1.1 QString --> int
int QString::toInt(bool * ok = 0, int base = 10) const
转换发生错误或者转换不成功ok指针值(第一个参数)为false;发生错误时,返回值为0。base 为转换进制
该方法有很大的局限性,要转换的字符串中只能有0-9的字符组成,如果含有其他字符,转换将会失败
1.2 QString --> double
double QString::toDouble(bool * ok = 0) const
转换发生错误,或者转换不成功ok为false;发生错误时,返回值为0.0。
支持将科学计数法转成double,不支持处理千组分隔符。
1.3 QString --> float
float QString::toFloat(bool * ok = 0) const
转换发生错误,或者转换不成功ok为false;发生错误时,返回值为0.0。
1.4 例子:
QString str = "11.55";
bool ok;
int a = str.toInt(&ok);
//当str出现除了0-9这些数字的其他符号(不包括" - "),将会转换失败,即只支持整数的转换
//str = "11" true
//str = "-11" true
qDebug() << ok << " a =" << a; //false a = 0
double b = str.toDouble(&ok);
qDebug() << ok << " b =" << b; //true b = 11.55
float c = str.toFloat(&ok);
qDebug() << ok << " c =" << c; //true c = 11.55
2. 数字转QString
下面介绍的转换成QString是用了同一个函数不同的重载而已。
2.1 int --> QString
QString QString::number(int n, int base = 10) [static]
n为需要转换的数字,base转换进制
2.2 double/folat --> QString
QString QString::number(double n, char format = ‘g’, int precision = 6) [static]
n为需要转换的数字;format格式,根据指定的格式和精度进行格式化;precision 精度,默认精度为6
2.3 setNum() 有多个重载
QString & QString::setNum(int n, int base = 10)
将n以base进制转为QString
2.3 例子:
int a = 123;
double b = 123.456;
float c = 465.12;
QString strA = QString::number(a);
qDebug() << "strA = " << strA; //strA = "123"
QString strB = QString::number(b);
qDebug() << "strB = " << strB; //strB = "123.456"
QString strC = QString::number(c);
qDebug() << "strC = " << strC; //strC = "465.12"
QString strD;
strD.setNum(a); //strD = "123"
三、QDateTime 与 QString之间的转换
1.日期格式
Expression | Output |
---|---|
d | 不带前导零的日(1到31) |
dd | 以零开头的数字表示的日期(01到31) |
ddd | 缩写的本地化日名称(例如,“Mon”到“Sun”)。使用系统区域设置本地化名称,即QLocale::system() |
dddd | 长的本地化日名称(例如,“Monday”到“Qt::Sunday”)。使用系统区域设置本地化名称,即QLocale::system() |
M | 不带前导零的月份(1-12) |
MM | 月份作为数字,前导零(01-12) |
MMM | 简略的本地化月份名称(例如“Jan”到“Dec”)。使用系统区域设置本地化名称,即QLocale::system() |
MMMM | 本地化的长月份名称(例如“一月”到“十二月”)。使用系统区域设置本地化名称,即QLocale::system() |
yy | 年份为两位数(00-99) |
yyyy | 四位数年份 |
2.时间格式
Expression | Output |
---|---|
h | 没有前导零的小时(如果显示AM/PM,则为0到23或1到12) |
hh | 前导零的小时(如果显示AM/PM,则为00到23或01到12) |
H | 没有前导零的小时(0到23,即使有AM/PM显示) |
HH | 前导零的小时(00到23,即使有AM/PM显示) |
m | 没有前导零的分钟(0到59) |
mm | 前导零的分钟(00到59) |
s | 没有前导零的秒(0到59) |
ss | 前导零的秒(00到59) |
z | 不带前导零的毫秒(0到999) |
zzz | 带前导零的毫秒(000到999) |
AP or A | 使用AM/PM显示器。A/AP将替换为“AM”或“PM”。 |
ap or a | 使用am/pm显示器。a/ap将替换为“am”或“pm”。 |
t | 时区(例如“CEST”) |
3.QDateTime --> QString
QString QDateTime::toString(const QString & format) const
format:指定格式
例子:
QString str;
//需要包含头文件 #include <QDateTime>
QDateTime Mytime;
//获取本地(本机)当前时间
Mytime = QDateTime::currentDateTime();
//按指定格式,转化字符串
str = Mytime.toString("yyyy-MM-dd HH:mm:ss");
qDebug() << str; //"2019-11-20 16:11:08"
4.QString --> QDateTime
QDateTime QDateTime::fromString(const QString & string, Qt::DateFormat format = Qt::TextDate) [static]
string 是需要转换的字符串,format 是格式
例子:
QString str = "2019-11-20 16:39:00";
QDateTime MyTime;
MyTime = QDateTime::fromString(str,"yyyy-MM-dd HH:mm:ss");
qDebug() << MyTime;
//输出结果为:QDateTime("2019-11-20 16:39:00.000 中国标准时间 Qt::LocalTime")
四、QString 与 QByteArray之间的转换
1. QString --> QByteArray
1.1 toLatin1()
QByteArray QString::toLatin1() const
以QByteArray的形式返回字符串的Latin-1表示形式。
如果字符串包含非拉丁字符,则返回的字节数组未定义。这些字符可以被取消或用问号代替
不支持中文,包含中文会乱码
1.2 toUtf8()
QByteArray QString::toUtf8() const
以QByteArray的形式返回字符串的UTF-8表示形式。
UTF-8是一个Unicode编解码器,可以像QString一样表示Unicode字符串中的所有字符
支持中文,不支持宽字符
1.3 toLocal8Bit()
QByteArray QString::toLocal8Bit() const
以QByteArray的形式返回本地操作系统设置的字符集编码。支持中文,在使用toUtf8()函数转换有问题的时候就可以使用这个函数,支持宽字符
1.3 例子
QString str = "My name is Li Hua哈";
QByteArray MyByteArray;
MyByteArray = str.toLatin1();
//"str = My name is Li Hua MyByteArray = My name is Li Hua?"
//有中文会乱码
qDebug() << "str = " << str << " MyByteArray = " << MyByteArray;
MyByteArray = str.toUtf8();
//"str = My name is Li Hua MyByteArray = My name is Li Hua哈"
qDebug() << "str = " << str << " MyByteArray = " << MyByteArray;
2. QByteArray --> QString
QString::QString(const QByteArray & ba)
QString的构造函数,使用ba构造一个QString
五、QString 与 char * 之间的转换
1. QString --> char *
1.1 QString --> QByteArray --> char *
例子:
QString str = "My name is Li Hua 哈哈";
//由于使用了toLatin1转换的不支持中文,包含的中文会乱码,所以我使用了toUtf8
//但是我上网搜了一下,好像没有人会这样转Char *,是不是有什么风险?这个本人就不得而知,测试结果是真香可观
QByteArray MyByteArray = str.toUtf8();
char *myChar = MyByteArray.data();
qDebug() << myChar;
//下面这个写法是错误的,不能串行写。
//myChar = str.toUtf8().data();
//qDebug() << myChar
从QByteArray转到char *的时候用到了data()
char * QByteArray::data()
返回char * ,以’\0’结尾的数据,即返回的字符串中的字节数是size() + 1,代表’\0’结尾.
上方例子中提到了不能串行写,这是为啥?
这里解释了为啥不能这样写
1.2 QString --> std::string --> char *
例子:
QString str = "My name is Li Hua 哈哈";
std::string myStr = str.toStdString();
const char * myChar = myStr.c_str();
qDebug() << myChar;
std::string QString::toStdString() const
1.返回一个std::string对象,其数据包含在这个QString中。
2.使用toUtf8()函数将Unicode数据转换为8位字符。
3.这个操作符主要用于将QString传递给接受std::string对象的函数。
4.如果QString包含非latin1 Unicode字符,那么使用它可能会导致信息丢失
使用 c_str() 转换过来的char * 是带const 修饰的,如果想要去掉const修饰,请使用
对它进行转换。
char * myCharStr = const_cast<char *>(myChar);
2. char * --> QString
直接调用QString的构造函数
QString(const char * str)
将str构造一个QString对象。
六、字符串转ASCII16进制
Qt将字符串快速转换为ASCII码16进制字符串
QByteArray中的 toHex() 函数,将字符串转为ASCII码16进制字符串。
QString stringToAsicc(QString){
QByteArray array = QString.toUtf8();
return array.toHex();
}
将ASCII码16进制字符串转为 “字符串”
QString asiccToString(QByteArray array){
return QByteArray::fromHex(array);
}
QString asiccToString(QString str){
return QByteArray::fromHex(str.toUtf8());
}