2009-11-28 39 views

Trả lời

70

Nếu bởi chuỗi bạn có nghĩa là std::string bạn có thể làm điều đó với phương pháp này:

QString QString::fromStdString(const std::string & str)

std::string str = "Hello world"; 
QString qstr = QString::fromStdString(str); 

Nếu bởi chuỗi bạn có nghĩa là Ascii mã hóa const char * sau đó bạn có thể sử dụng phương pháp này:

QString QString::fromAscii(const char * str, int size = -1)

const char* str = "Hello world"; 
QString qstr = QString::fromAscii(str); 

Nếu bạn có const char * mã hóa với mã hóa hệ thống có thể được đọc với QTextCodec::codecForLocale() thì bạn nên sử dụng phương pháp này:

QString QString::fromLocal8Bit(const char * str, int size = -1)

const char* str = "zażółć gęślą jaźń";  // latin2 source file and system encoding 
QString qstr = QString::fromLocal8Bit(str); 

Nếu bạn có const char * đó là UTF8 mã hóa thì bạn sẽ cần phải sử dụng phương pháp này:

QString QString::fromUtf8(const char * str, int size = -1)

const char* str = read_raw("hello.txt"); // assuming hello.txt is UTF8 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const char* 
QString qstr = QString::fromUtf8(str); 

Ngoài ra còn có phương pháp để const ushort * chứa UTF16 mã hóa chuỗi:

QString QString::fromUtf16(const ushort * unicode, int size = -1)

const ushort* str = read_raw("hello.txt"); // assuming hello.txt is UTF16 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const ushort* 
QString qstr = QString::fromUtf16(str); 
+1

Bạn sẽ không muốn để xây dựng các QString với 'mới'. – rohanpm

+0

@Rohan - Cảm ơn bạn đã bình luận. Tôi đang xóa nó khỏi câu trả lời của tôi. –

+0

Nó không trả lời câu hỏi. – CCoder

10
std::string s = "Sambuca"; 
QString q = s.c_str(); 

Cảnh báo: này sẽ không làm việc i f số std::string chứa \0 s.

+10

Không hoạt động với nhúng \ \ 0'. –

+0

Nó cũng không an toàn cho Unicode. –

0

Bạn có nghĩa là chuỗi C, như trong một chuỗi char* hoặc đối tượng C++ std::string?

Dù bằng cách nào, bạn sử dụng các nhà xây dựng cùng, như được ghi lại trong tài liệu tham khảo QT:

Đối với một chuỗi C thường xuyên, chỉ cần sử dụng các nhà xây dựng chính:

char name[] = "Stack Overflow"; 
QString qname(name); 

Đối với số std::string, bạn nhận được char* vào bộ đệm và chuyển số đó cho QString constructor:

std::string name2("Stack Overflow"); 
QString qname2(name2.c_str()); 
+2

Ví dụ 'std :: string' không hoạt động với' \ 0' được nhúng. –

+1

Đúng, mặc dù OP đã không đề cập đến NULLs nhúng. Nếu điều đó là bắt buộc, bạn có thể sử dụng 'QByteArray :: QByteArray (const char * dữ liệu, int size)' để bao bọc bộ đệm đầu tiên, và sau đó chuyển nó tới hàm tạo 'QString'. – gavinb

229

Nếu biên soạn với khả năng tương thích STL, QStringstatic method để chuyển đổi một std::string đến một QString:

std::string str = "abc"; 
QString qstr = QString::fromStdString(str); 
+33

Đây phải là câu trả lời được chấp nhận. –

+3

Điều này thực sự nên tránh theo ý kiến ​​của tôi. Nếu phiên bản của thư viện chuẩn QT được biên dịch bằng cách nào đó khác với những gì bạn đang biên dịch, bạn sẽ gặp rắc rối. Tạo ra sự phụ thuộc không cần thiết giữa QT và libstdC++ không tồn tại trong QT. – shoosh

+0

@shoosh: Để tránh điều đó, người ta không thể làm 'QString qstr = QString (str.c_str());'? Không chắc chắn liệu bản sao 'QString' có được truyền vào nó hay không. – Claudiu

13

cách Alternative:

std::string s = "This is an STL string"; 
QString qs = QString::fromAscii(s.data(), s.size()); 

này có lợi thế là không sử dụng .c_str() có thể gây ra std::string đến c opy chính nó trong trường hợp không có chỗ để thêm '\0' ở cuối.

+2

Cảm ơn gợi ý về bản sao ẩn tiềm ẩn với .c_str(). – Trass3r

+0

Với C++ 11, điều này không còn là một mối quan tâm (bản sao ẩn với '.c_str()') –

+1

Trước C++ 11, bản sao ẩn tiềm năng là một khả năng lý thuyết hoàn toàn - không có triển khai thực sự làm điều đó. –

3

Tôi đã xem qua câu hỏi này vì tôi gặp sự cố khi làm theo các câu trả lời, vì vậy tôi đăng giải pháp của mình tại đây.

Các ví dụ trên cho thấy tất cả các mẫu có chuỗi chỉ chứa giá trị ASCII, trong trường hợp đó mọi thứ đều hoạt động tốt. Tuy nhiên, khi giao dịch với chuỗi trong Windows whcih cũng có thể chứa các ký tự khác, như umlauts Đức, sau đó các giải pháp này không làm việc

Mã duy nhất cho kết quả đúng trong trường hợp này là

std::string s = "Übernahme"; 
QString q = QString::fromLocal8Bit(s.c_str()); 

Nếu bạn không phải đối phó với các chuỗi như vậy, sau đó các câu trả lời ở trên sẽ hoạt động tốt.

0

Hơn nữa, để chuyển đổi bất cứ điều gì bạn muốn, bạn có thể sử dụng lớp QVariant.

ví dụ:

std::string str("hello !"); 
qDebug() << QVariant(str.c_str()).toString(); 
int test = 10; 
double titi = 5.42; 
qDebug() << QVariant(test).toString(); 
qDebug() << QVariant(titi).toString(); 
qDebug() << QVariant(titi).toInt(); 

đầu ra

"hello !" 
"10" 
"5.42" 
5 
Các vấn đề liên quan