QT —— <QString> 转int, float, double, QByteArray 等

QString类 基本说明:

编码格式:提供了一个Unicode字符字符串
存储方式:存储了一个16位QChars字符串,其中每个QChar对应一个Unicode 4.0字符
优势       :使用隐式共享(即写即复制)来减少内存使用并避免不必要的数据复制
扩展       :除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位'\0'结尾的字符串,QByteArray适用于两种主要情况是:当需要存储原始二进制数据时,以及内存保护非常重要(比喻嵌入式系统中)时


一 、 QString 转 (int , float , double,char*, string, QByteArray)


1. 不使用参数

/************** qstring 转 其他(不添加参数)******************//
int main()
{
    QString     str      = "111.22";
    QString     str1     = "aa";
    double      toDouble = str.toDouble(); //val:111.22
    float       toFloat  = str.toFloat();  //val: 111.2200012
    int         toInt    = str.toInt();    //val: 0
    int         toInt2   = str1.toInt();   //val: 0
    
    QString     str2     = "hello world";
    //错误方式
    const char  *toChar  = str2.toLocal8Bit().data();//val:乱码(错误示范)
    const char  *toChar1 = str2.toStdString().data();//val:乱码(错误示范)
    
    //正确方式
    QByteArray  byteArray = str2.toLocal8Bit();//val:"hello world"
    std::string string1   = str2.toStdString();//val:"hello world"
    
    const char* toChar2   = byteArray.data();
    const char* toChar3   = string1.data();
    
    return 0;
}

 

2. 使用参数

///************** qstring 转 其他(添加参数) ******************//
int main()
{
    QString str      = "111.22";
    QString str1     = "FF";
    bool    ok;
    double  toDouble = QString("1111.22e-02").toDouble(&ok); //val:ok = true; toDouble = 11.1122
    float   toFloat  = str.toFloat(&ok); //val:0; ok = false
    int     toDec    = str.toInt(&ok, 10); //val: 0; ok = false
    int     toHex    = str.toInt(&ok, 16); //val: 0; ok = false
    int     toDec1   = str1.toInt(&ok, 10); //val: 0; ok = false
    int     toHex1   = str1.toInt(&ok, 16); //val: 255; ok = true
      
    return 0;
}

3. 注意事项:

①浮点数的存储。

当QString 转 float 时 会多存几位不用的数据,一般情况下,需要用浮点运算的地方建议用 double , 有精度要求的浮点运转转成 int 后再存储。
②QString 转 char* 要考虑字符集的问题。

utf16字符集下每个字母都是2个字节,utf8下是8个字节。看到网上有直接转char*的,下面源码中有错误示范方式,有正确示范方式。

 

二、(int , float , double) 转 QString

///**************其他 转 qstring  ******************//
int main()
{
    long    long1       = 22;
    int     int1        = 22;
    double  double1     = 22.22;
    
    QString longToStr   = QString::number(long1, 10);//val: "22"
    QString longToStr2  = QString::number(long1, 16).toUpper();//val: "16"
    QString longToStr3  = QString("%1").arg(long1);//val: "22"
    
    QString intToStr    = QString::number(int1);//val: "22"
    QString doubleToStr = QString::number(double1);//val: "22.22"
    
    return 0;
}

 

三、访问 QString 中的字符

/************** 访问 qstring 中的字符 ******************//
int main()
{
    QString    str    = "hello wrold";
    QString    aa     = str[1];         //val:"e"
    QString    bb     = str.at(1);      //val:"e"
    QString    left   = str.left(2);    //val:"he"
    QString    right  = str.right(2);   //val:"ld"
    QString    mid    = str.mid(0, 2);  //val:"he"

    return 0;
}

详细说明:

  • 操作符 [ ] 访问:  QString像c++数组一样使用基于0的索引。对于非const字符串,操作符[]返回一个对字符的引用,该字符可用于赋值的左侧
  • at() 访问 :   当只读访问某个字符时,可以使用at()。优势:at()函数可以比运算符[]更快,因为它不会导致深度复制。
  • left()、right()、mid: 一次提取几个字符

 

四、操作 QString 数据

/************** 操作 qstring 中的数据 ******************//
int main()
{
    QString str    = "hello wrold"; 
    str.prepend("aaaa ");           //val:"aaaa hello wrold"
    str.append(" bbbb");            //val:"aaaa hello wrold bbbb"
    str.replace(0, 3, "0");         //val:"0a hello wrold bbbb"
    str.remove(0, 4);               //val:"ello wrold bbbb"
    
    //size()
    QString str2    = "hello";
    int     size    = str2.size();
    
    //resize()
    str2.resize(10);
    int     size2   = str2.size();
    
    //fill()
    str2.fill("z");
    
    //遍历所有出现字符串的地方
    int index = 0;
    while(index = str.indexOf("bb",index) != -1)
    {
        qDebug() << index;
        ++index;
    }
    
    return 0;
}


详细说明:

  • append()、prepend()、insert()、replace()、remove():修改字符数据
  • size() :      获取整个字符串的大小。
  • resize():   重新分配字符串大小,新分配的字符具有未定义的值。
  • fill():         将字符串中的所有字符设置为特定值
  • indexOf():遍历是否存在字符

 

五、查询字符串数据

/************** 查询 qstring 中的数据 ******************//
int main()
{
    QString str     = "hello wrold"; 
    bool    bool1   = str.startsWith("he"); //val:true
    bool    bool2   = str.endsWith("old");  //val:true
    bool    bool3   = str.contains("ll");   //val:true
    int     count   = str.count("l");       //val:3
    bool    bool4   = (str == "hello");     //val:false
    
    return 0;
}

详细说明:

  • startsWith()或endsWith():查看QString是否以特定的子字符串开始或结束
  • contains():查看QString是否包含特定的字符或子字符串
  • count():     查看一个特定的字符或子字符串在字符串中出现了多少次
  • 操作符==():比较两个字符串是否相等

 

 

六、Null 和 Empty 之间的区别

  QString().isNull();               // returns true
  QString().isEmpty();              // returns true

  QString("").isNull();             // returns false
  QString("").isEmpty();            // returns true

  QString("abc").isNull();          // returns false
  QString("abc").isEmpty();         // returns false

详细说明:

  • null string:     是使用QString的默认构造函数或通过将(const char *)0传递给构造函数来初始化的字符串。
  • empty string :是任何大小为0的字符串。

null string总是空的,但是empty string不一定是空的:

注:除isNull()之外的所有函数都将 null strings视为 empty strings。例如,toUtf8(). constdata()为null string返回一个指向'\0'字符的指针(不是空指针)。
QString()与QString("")比较。建议您始终使用isEmpty()函数,并避免使用isNull()函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值