在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"
|
菜鳥一枚,歡迎指出錯誤之處!