Làm cách nào để thay đổi chuỗi thành QString?


Câu trả lời:


152

Nếu theo chuỗi, bạn có nghĩa là std::stringbạn có thể làm điều đó với phương thức này:

QString QString :: fromStdString (const std :: chuỗi & str)

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

Nếu theo chuỗi, bạn có nghĩa là mã hóa Ascii const char *thì bạn có thể sử dụng phương thức 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 đã const char *mã hóa bằng mã hóa hệ thống có thể được đọc bằng 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 đã const char *mã hóa UTF8 thì bạn sẽ cần 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 chuỗi được mã hóa UTF16:

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 QString với 'new'.
rohanpm

@Rohan - Cảm ơn bạn đã bình luận của bạn. Tôi đang loại bỏ điều này khỏi câu trả lời của tôi.
Kamil Szot

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

1
Tôi chưa bao giờ thấy câu trả lời được chấp nhận với rất nhiều downvote. Tại sao tác giả không chỉnh sửa nó trong một cái gì đó tốt hơn câu trả lời được bình chọn cao nhất? Giống như thêm chi tiết? Cho đến lúc đó, hãy tận hưởng thêm -1.
Tomáš Zato - Phục hồi Monica

3
Có vẻ như nó đã được sửa bây giờ và khá tốt, vì vậy tôi đã cho cả cái này và cái kia +1.
csl

242

Nếu được biên dịch với khả năng tương thích STL, QStringcó một phương thức tĩnh để chuyển đổi a std::stringthành QString:

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

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, thì bạn sẽ gặp rắc rối. In tạo ra một sự phụ thuộc không cần thiết giữa QT và libstdc ++ không tồn tại ở nơi nào khác trong QT.
shoosh

@shoosh: Để tránh điều đó không ai có thể làm QString qstr = QString(str.c_str());? Không chắc chắn liệu QStringbản sao những gì được truyền vào nó.
Claudiu

@shoosh: Tôi hiểu mối quan tâm của bạn về khả năng tương thích, nhưng cả QString và std :: chuỗi đều có thể chứa các ký tự null. fromStdStringsẽ bảo tồn những thứ này, xây dựng từ .c_strsẽ không. (Và chính xác là làm thế nào để làm điều này dẫn tôi đến câu hỏi này.)
Martin Bonner hỗ trợ Monica

@MartinBonner QByteArray có một ctor lấy const char * và chiều dài. QString có một ctor rằng mất QByteArray
shoosh

13

Thay đổi phương pháp:

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

Điều này có lợi thế là không sử dụng .c_str()có thể khiến std::stringbản sao tự sao chép trong trường hợp không có chỗ để thêm '\0'vào cuối.


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

Với c ++ 11, điều này không còn là vấn đề đáng lo ngại nữa (bản sao ẩn với .c_str())
Steve Lorimer

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 nào thực sự làm được điều đó.
Martin Bonner hỗ trợ Monica

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

Cảnh báo: Điều này sẽ không hoạt động nếu std::stringchứa \0s.


3

Tôi đã gặp câu hỏi này bởi vì tôi có một vấn đề khi làm theo câu trả lời, vì vậy tôi đăng giải pháp của tôi ở đây.

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

Mã duy nhất cho kết quả chính xác trong các trường hợp như vậy là

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

Nếu bạn không phải xử lý các chuỗi như vậy, thì các câu trả lời trên sẽ hoạt động tốt.


Điều này không phụ thuộc vào chuỗi std :: mà là mã hóa tệp nguồn của bạn bằng chuỗi ký tự. Nếu tệp nguồn của bạn là UTF8, nó sẽ hoạt động nhưng ngắt cuộc gọi của bạn đếnfromLocal8Bit()
namezero

0

Hơn nữa, để chuyển đổi bất cứ thứ 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

0

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

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

Đối với một chuỗi C thông thường, chỉ cần sử dụng hàm tạo chính:

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

Đối với a std::string, bạn có được char*bộ đệm và chuyển nó đến hàm QStringtạo:

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

1
Đúng như vậy, mặc dù OP không đề cập đến các NULL nhúng. Nếu điều đó là bắt buộc, bạn có thể sử dụng QByteArray::QByteArray (const char* data, int size)để bao bọc bộ đệm trước, sau đó chuyển nó cho hàm QStringtạo.
gavinb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.