QString 与 std::string 的相互转换方法 (**)

118 篇文章 7 订阅

QString 与 std::string 的相互转换方法

------------------------------------------------------

经试验,std::string 与 QString 转换过程中 utf-8 显示可能为乱码,Local8Bit 不会有乱码,所以有以下方法:

void stdString2QString(std::string str, QString &qs)
{
    qs = QString::fromLocal8Bit(QByteArray::fromRawData(str.c_str(), str.size()));
}

void QString2stdString(QString qs, std::string &str)
{
    str = qs.toLocal8Bit().constData();
}

===============================

QString 与 std::string 的相互转换方法

  https://www.cnblogs.com/nanfei/p/13230843.html

Visual Studio 2017 + Qt5.12.0

下面这段代码Release下编译运行都没问题,但Debug模式下运行报错,程序崩溃:

std::string a("abc");
QString b = QString::fromStdString(a);

试了半天也没找到一个通用的办法,于是根据网上的指导,根据字符串定义时的原始类型,找到了一种根据原始类型判断互转的办法:

//QString to std::string
QString qs_original("ab中国cd");
std::string str = qs_original.toUtf8().constData();
QString qs_recovered = QString::fromUtf8(QByteArray::fromRawData(str.c_str(), str.size()));

    

//std::string to QString
std::string str_original("ab中国cd");
QString qs = QString::fromUtf8(QByteArray::fromRawData(str_original.c_str(), str_original.size()));
std:string str_recovered = qs.toLocal8Bit().constData();

经试验,std::string 与 QString 转换过程中 utf-8 显示可能为乱码,Local8Bit 不会有乱码,所以有以下方法:

void stdString2QString(std::string str, QString &qs)
{
    qs = QString::fromLocal8Bit(QByteArray::fromRawData(str.c_str(), str.size()));
}

void QString2stdString(QString qs, std::string &str)
{
    str = qs.toLocal8Bit().constData();
}

测试代码如下:

std::string str("ab中国cd");
QString qs;
stdString2QString(str, qs);
std::string str2;
QString2stdString(qs, str2);

搞定!
桂棹兮兰桨,击空明兮溯流光。

QT基础 - QString 与 std::string 之间类型转换

摘要

string 与 QString之间转换

  •     QString qstr = QString::fromStdString(str);
  •     QString qstr = QString::fromLocal8Bit(QByteArray::fromRawData(str.c_str(), str.size()));
  •     std::string str = qstr.toLocal8Bit().constData();
  •     QString str = QString("%1 %2 %3 "). arg(“1”,“2”,“3”, … …)

1. string 与 QString之间转换

1.1. string --> QString 方法1

std::string a("abc");
QString b = QString::fromStdString(a);

void hdmap_client::set_one_combobox(QComboBox & q,  const std::vector<std::string> & v)
{
    q->clear();
    for(auto&it : v)
    {
        q->addItem(QString::fromStdString(it));
    }
}

1.2. string --> QString 方法2

void stdString2QString(std::string str, QString &qs)
{
    qs = QString::fromLocal8Bit(QByteArray::fromRawData(str.c_str(), str.size()));
}

1.3 QString --> string

void QString2stdString(QString qs, std::string &str)
{
    str = qs.toLocal8Bit().constData();
}

注意: 与QString 转换过程中 utf-8 显示可能为乱码,Local8Bit 不会有乱码

1.4. 示例:

//QString to std::string
QString qs_original("ab中国cd");
std::string str = qs_original.toUtf8().constData();
QString qs_recovered = QString::fromUtf8(QByteArray::fromRawData(str.c_str(), str.size()));

//std::string to QString
std::string str_original("ab中国cd");
QString qs = QString::fromUtf8(QByteArray::fromRawData(str_original.c_str(), str_original.size()));
std:string str_recovered = qs.toLocal8Bit().constData();

2. Qstring格式化函数 arg使用

arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。主要有以下几种常用方式:

  •     使用arg(str1, str2, str3)这种方法进行替换。
  •     使用arg(str1).arg(str2).arg(str3)这种方法进行替换。
  •     使用arg(int, int, int)这种方式进行替换。

2.1. 使用arg(str1, str2, str3)

函数原型:

QString QString::arg(const QString & a1, const QString & a2, const QString & a3, const QString & a4, const QString & a5, const QString & a6, const QString & a7, const QString & a8, const QString & a9) const

 注意: arg( )里的参数实现从1个到9个,也就是说最多只能有9个!这也就意味着,如果有如下代码:

QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11").
            arg("1","2","3","4","5","6","7","8","9")

str将只会输出: "1 2 3 4 5 6 7 8 9 %10 %11"

解决方法为在后面再加一个arg方法,放上后面两个对应的参数:

QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11").
            arg("1","2","3","4","w","6","7","8","9").arg("a","b");

输出为: 1 2 3 4 5 6 7 8 9 a b

2.2. 使用arg(str1).arg(str2).arg(str3)

这种方法其实前面用到了,如下面例子:

QString str=QString("%1 %2 %3 %4").arg("A").arg("B").arg("C").arg("D");
//str=="A B C D"

简单说就是挨着替换呗。但请注意下面的形式:

str = QString("%1 %2").arg("%1World", "Hello");
qDebug()<<str;
//输出为:"%1World Hello"

str = QString("%1 %2").arg("%1World").arg("Hello");
qDebug()<<str;
//输出为:"HelloWorld %2"
//第一个arg执行完后变为:QString("%1World %2").arg("Hello")
//再次执行后"Hello"替换的为%1

所以在使用多个arg( )连接时,一定要注意,前面连接使用的arg( )里如果有“%+数字”的情况,后面的arg( )会同样替换!

请注意下列例子:

str = QString("%1 %2").arg("%1World").arg("Hello");
 //输出:"HelloWorld %2"

str = QString("%1 %2").arg("%2World").arg("Hello");
 //输出:"HelloWorld Hello"

str = QString("%1 %2").arg("%3World").arg("Hello");
//输出:"%3World Hello"

str = QString("%1 %2").arg("%8World").arg("Hello");
//输出:"%8World Hello"

str = QString("%1 %6").arg("%3World").arg("Hello");
 //输出:"HelloWorld %6"

str = QString("%2 %6").arg("%3World").arg("Hello");
 //输出:"HelloWorld %6"

str = QString("%0 %6").arg("%3World").arg("Hello");
//输出:"HelloWorld %6"

str = QString("%-1 %6").arg("%3World").arg("Hello");
//输出:"%-1 HelloWorld"

注意: arg( )里的参数在进行替换时,只会按照数字从小到大的顺序进行替换,只有比当前数字小的所有数字都替换完成了,才会替换当前数字,否则将当前数字和%按字符串处理。且数字为自然数 (即 >0 )!

2.3. 使用arg(int, int, int)

原型【1】为:

QString QString::arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const

    a:表示要处理的数字;
    fieldWidth:字宽;
    base:数字基数;
    fillChar为当设置了fieldWidth之后,自动补齐的字符

示例如下:

str = QString("十进制 63 的十进制为 %1").arg(63, 0, 10);
//输出:"十进制 63 的十进制为 63"  

str = QString("十进制 63 的十六进制为 %1").arg(63, 0, 16);
//输出:"十进制 63 的十六进制为 3f"

str = QString("%1 %L2 %L3").arg(12345)
            .arg(1987654321)  //根据结果,可知道这个L的作用
            .arg(12345, 0, 8); //但使用这种方式时,L失效
//输出为:12345 1,987,654,321 30071
//这里%L3的L没有任何作用

2.4. 使用arg(double, double, double)

在原型【1】中的a的类型还可以是uint、long、double、udouble等数字的类型!

这里当a的类型为double时,原型为:

QString QString::arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1, QChar fillChar = QLatin1Char( ' ' )) const

    format和precision,一个指明规格,一个指明精度。
    规格默认为 ‘g’ 或 ‘G’,指示后面的精度为整数和小数部分总和的长度;
    规格为’e’或 ‘E’ 时,表示为科学记数法形式,精度部分指示的为小数部分的位数长度;
    规格为其他字符时,无作用,输出原double数字。

示例如下:

double d = 12.345689;

str = QString("delta: %1").arg(d, 0, 'g',4);
//输出为:"delta: 12.35"     ---这里进行了四舍五入

str = QString("delta: %1").arg(d, 0, 'G',5);
//输出为:"delta: 12.346"     ---这里进行了四舍五入

str = QString("delta: %1").arg(d, 0, 'e',4);
//输出为:"delta: 1.234e+01"

str = QString("delta: %1").arg(d, 0, 'E',4);
//输出为:"delta: 1.234E+01"

str = QString("delta: %1").arg(d, 0, 'r',4);
//输出为:"delta: 12.345689"

str = QString("delta: %1").arg(d, 0, 'Q',4);
//输出为:"delta: 12.345689"

2.5. 项目代码示例

  myLogInstance2.LogDebug("%s()[%d] const std::pair<int,int> &v: i = %d, iStr = %s",  __FUNCTION__, __LINE__, i,
    (char *)(QString("%1").arg(i, 3 ,10, QChar('0'))).toUtf8().constData());

————————————————
版权声明:本文为CSDN博主「Adunn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/limeigui/article/details/123693102

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: qstring::fromstdstringQt中的一个函数,用于将std::string类型的字符串转换为QString类型的字符串。这个函数可以方便地在Qt程序中使用std::string类型的字符串,而不需要进行繁琐的类型转换。 ### 回答2: qstring::fromstdstringQt框架中的一个函数,用于将C++标准库中的std::string类型转换为Qt框架中的QString类型。在实际开发中,由于Qt框架与C++标准库的差异,需要经常进行数据类型转换,这其中就包括将std::string转换为QStringQStringQt框架中的一个字符串类型,与std::string的使用方式有所不同。qstring::fromstdstring可以将std::string转换为QString,从而解决在Qt项目中使用std::string时的一些问题。这个函数接受一个std::string类型的参数,并返回一个QString类型的值。 这个函数的使用非常简单,只需要将std::string类型的变量作为参数传入即可。例如: std::string str = "Hello World"; QString qstr = qstring::fromstdstring(str); 这段代码将std::string类型的变量str转换为了QString类型的变量qstr。在转换的过程中,qstring::fromstdstring会自动处理编码方式等细节,保证转换结果的准确性和可靠性。 需要注意的是,在使用qstring::fromstdstring时需要包含头文件QString。另外,在Qt中还有一个函数QString::fromStdString,其作用与qstring::fromstdstring相同,只是函数名略有不同。因此,在实际开发中需要注意不要混淆使用。 总之,qstring::fromstdstringQt框架中非常重要的一个函数,它能够帮助开发者在Qt项目中使用std::string类型时更为便捷和自如。 ### 回答3: qstring::fromstdstringQt框架中提供的一个函数,用于将C++标准库中的std::string类型转换为Qt框架中的QString类型。 std::stringC++标准库中的一种字符串类型,而QString则是Qt框架中的一种字符串类型。在使用Qt框架时,需要经常进行QStringstd::string类型之间的转换。qstring::fromstdstring函数就是为了方便这种转换而提供的。 使用qstring::fromstdstring函数,可以将一个std::string类型的字符串转换为一个QString类型的字符串。转换后的QString对象可以在Qt框架中使用,如在界面上显示、进行字符串操作等。 qstring::fromstdstring函数的语法如下: QString qstring::fromstdstring(const std::string& str) 其中,str为要转换的std::string类型的字符串。函数返回一个QString类型的字符串,表示从std::string类型字符串转换来的结果。 需要注意的是,在将std::string类型字符串转换为QString类型字符串时,可能会涉及到字符编码的问题。Qt框架中使用的是Unicode编码,而std::string类型字符串则可能使用不同的字符编码(如UTF-8、ANSI等)。因此,需要在转换时注意字符编码的一致性,避免出现乱码等问题。 总之,qstring::fromstdstring函数是Qt框架中用于将std::string类型字符串转换为QString类型字符串的一个重要函数,方便了Qt开发者进行字符串处理和界面显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值