转载。标记一下,总结的很好
转自 http://www.cnblogs.com/lomper/p/4135387.html
在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。
在QT5的帮助文档中,可以看出以下几点:
-
使用arg(str1, str2, str3)这种方法进行替换。
-
使用arg(str1).arg(str2).arg(str3)这种方法进行替换。
-
使用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"
|