QT之HTTP 和 QString

 
 

在项目代码里看到了下面的程序,这是QT跟服务器连接,发送和接受HTTP请求

在网上找了一些资料知道以前的QT版本是使用QHTTP类来处理HTTP请求的,新版本是使用QNetworkAccessManager来进行管理的。

HTTP请求在QT中相应的类为QNetworkRequest,HTTP响应相应的类为QNetworkReply。


创建一个请求:

QNetworkRequest request;
request.setUrl(QUrl(URL_QRCODE_PIC.arg(tradeNo).arg(qrcode)));

    QString URL_QRCODE_PIC =            "http://192.168.0.5:8080/CashlessTraderServer/QRCodeTradeServlet"
                                        "?action=createqrImage"
                                        "&outTradeNo=%1"
                                        "&qrcode=%2";


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

//创建一个请求
QNetworkRequest request;

request.setUrl(QUrl("http://www.baidu.com"));

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


很好奇   URL_QRCODE_PIC.arg(tradeNo).arg(qrcode)

原来是QString类在作怪,tradeNo 替换了URL_QRCODE_PIC中的%1,qrcode替换了URL_QRCODE_PIC中的%2

详细的解释看下面:

在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。

在QT5的帮助文档中,可以看出以下几点:

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

  2. 使用arg(str1).arg(str2).arg(str3)这种方法进行替换。

  3. ​使用arg(int, int, int)这种方式进行替换。

解释以下两种方法:

一:使用arg(str1, str2, str3)

这种方法要求str1、str2、str3都为const QString &类型,即:

1
QString QString::arg( const  QString & a1, const  QString & a2, const  QString & a3) const

同时,arg( )里的参数实现从1个到9个,也就是说最多只能有9个!即在实现中,arg的定义中参数最多的为:

1
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

这也就意味着,如果有如下代码:

1
2
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
"1 2 3 4 5 6 7 8 9 %10 %11"

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

1
2
3
4
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"

注意:在QT5帮助文档中,给出了如下代码:

1
2
3
4
5
QString str;
str = "%1 %2" ;
 
str.arg( "%1f" , "Hello" );        // returns "%1f Hello"
str.arg( "%1f" ).arg( "Hello" );    // returns "Hellof %2"

如果你copy这个代码去测试一下,会发现,输出结果还是:"%1 %2" 。根本没有其给出的结果。(没找到源码,有谁知道怎么查看QT的源码,求帮助!说找src文件夹的就不要来了,根本木有)

所以在使用的时候一定要注意一下。要紧跟字符串使用arg( ) 。

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

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

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

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

1
2
3
4
5
6
7
8
9
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( )会同样替换!

请注意下列例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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( )里的参数在进行替换时,只会按照数字从小到大的顺序进行替换,只有比当前数字小的所有数字都替换完成了,才会替换当前数字,否则将当前数字和%按字符串处理。且数字为自然数

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

原型【1】为:

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

a:表示要处理的数字;fieldWidth:字宽;base:数字基数

如下列:

1
2
3
4
5
6
7
8
9
10
11
12
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没有任何作用

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

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

1
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数字。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
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"

猜你喜欢

转载自blog.csdn.net/weixin_41157654/article/details/80821987