2011-01-24 42 views
59

Tôi muốn định dạng chuỗi cho nhãn Qt, tôi đang lập trình bằng C++ trên Qt.Cách định dạng QString?

Trong ObjC Tôi sẽ viết một cái gì đó như:

NSString *format=[NSString stringWithFormat: ... ]; 

Làm thế nào để làm điều gì đó như thế trong Qt?

Trả lời

24

Bạn có thể sử dụng phương pháp sprintf, tuy nhiên phương thức arg được ưu tiên hơn vì nó hỗ trợ unicode.

QString str; 
str.sprintf("%s %d", "string", 213); 
125

Bạn có thể sử dụng QString.arg như thế này

QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", "Jane"); 
// You get "~/Tom-Jane.txt" 

Phương pháp này được ưa thích hơn vì sprintf:

Thay đổi vị trí của các chuỗi mà không cần phải thay đổi thứ tự thay thế, ví dụ

// To get "~/Jane-Tom.txt" 
QString my_formatted_string = QString("%1/%3-%2.txt").arg("~", "Tom", "Jane"); 

Hoặc thay đổi loại đối số không yêu cầu thay đổi chuỗi định dạng, ví dụ:

// To get "~/Tom-1.txt" 
QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", QString::number(1)); 

Như bạn có thể thấy, thay đổi là tối thiểu. Tất nhiên, bạn thường không cần phải quan tâm về loại được chuyển vào QString :: arg() vì hầu hết các loại được nạp chồng đúng cách.

Một hạn chế mặc dù: QString :: arg() không xử lý std :: string. Bạn sẽ cần phải gọi: QString :: fromStdString() trên std :: string của bạn để làm cho nó thành một QString trước khi chuyển nó đến QString :: arg(). Hãy thử để tách các lớp học sử dụng QString từ các lớp học sử dụng std :: string. Hoặc nếu bạn có thể, chuyển sang QString hoàn toàn.

CẬP NHẬT: Ví dụ được cập nhật nhờ Frank Osterfeld.

CẬP NHẬT: Ví dụ được cập nhật nhờ alexisdm.

+17

Tránh các chuỗi .arg(). Arg() như thế này, thay vì .arg (x) .arg (y) .arg (z) sử dụng .arg (x, y, z). Nó nhanh hơn và an toàn hơn - Nếu chuỗi x chứa ví dụ: "% 1", y sẽ thay thế% 1 đó thay vì% 2. Thường không phải là một trong những dự định. –

+3

Mặc dù bạn có thể thay đổi thứ tự, nhưng dường như không thể loại bỏ các đối số được đánh số. Ví dụ, QString ("% 3"). Arg ("~", "Tom", "Jane") dẫn đến "~". Không hoàn toàn hữu ích như nó có vẻ lúc đầu ... – iforce2d

+0

Có lẽ, nhưng sau đó nó không có ý nghĩa để lại những đối số thêm trong arg() là tốt. Trong sprintf, nếu bạn thay đổi kiểu của các đối số, bây giờ bạn cũng cần thực hiện nhiều thay đổi hơn trong chuỗi định dạng của bạn. –

Các vấn đề liên quan