Cách cơ bản nhất để làm điều đó là gì?
Cách cơ bản nhất để làm điều đó là gì?
Câu trả lời:
Nếu theo chuỗi, bạn có nghĩa là std::string
bạ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);
Nếu được biên dịch với khả năng tương thích STL, QString
có một phương thức tĩnh để chuyển đổi a std::string
thành QString
:
std::string str = "abc";
QString qstr = QString::fromStdString(str);
QString qstr = QString(str.c_str());
? Không chắc chắn liệu QString
bản sao những gì được truyền vào nó.
fromStdString
sẽ bảo tồn những thứ này, xây dựng từ .c_str
sẽ 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.)
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::string
bản sao tự sao chép trong trường hợp không có chỗ để thêm '\0'
vào cuối.
.c_str()
)
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::string
chứa \0
s.
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.
fromLocal8Bit()
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
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 QString
tạo:
std::string name2("Stack Overflow");
QString qname2(name2.c_str());
QByteArray::QByteArray (const char* data, int size)
để bao bọc bộ đệm trước, sau đó chuyển nó cho hàm QString
tạo.