Qt的QString数据类型转换(整理)

文章目录

  • 一、Qt的数据类型有那些?
  • 二、QString与数字之间的转换:
    • 1. QString转数字
      • 1.1 QString --> int
      • 1.2 QString --> double
      • 1.3 QString --> float
      • 1.4 例子:
    • 2. 数字转QString
      • 2.1 int --> QString
      • 2.2 double/folat --> QString
      • 2.3 setNum() 有多个重载
      • 2.3 例子:
  • 三、QDateTime 与 QString之间的转换
    • 1.日期格式
    • 2.时间格式
    • 3.QDateTime --> QString
    • 4.QString --> QDateTime
  • 四、QString 与 QByteArray之间的转换
    • 1. QString --> QByteArray
      • 1.1 toLatin1()
      • 1.2 toUtf8()
      • 1.3 例子
    • 2. QByteArray --> QString
  • 五、QString 与 char * 之间的转换
    • 1. QString --> char *
      • 1.1 QString --> QByteArray --> char *
      • 1.2 QString --> std::string --> char *
    • 2. char * --> QString

一、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 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 例子

	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对象。

你可能感兴趣的:(Qt)