Bagaimana cara mengubah string menjadi QString?


Jawaban:


154

Jika menurut Anda std::stringAnda dapat melakukannya dengan metode ini:

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

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

Jika dengan string maksud Anda Ascii disandikan const char *maka Anda dapat menggunakan metode ini:

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

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

Jika Anda telah const char *disandikan dengan penyandian sistem yang dapat dibaca dengan QTextCodec :: codecForLocale () maka Anda harus menggunakan metode ini:

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);

Jika Anda memiliki const char *UTF8 yang disandikan maka Anda harus menggunakan metode ini:

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);

Ada juga metode untuk const ushort *berisi string yang dikodekan UTF16:

QString QString :: fromUtf16 (const ushort * unicode, ukuran int = -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
Anda tidak ingin membuat QString dengan `baru '.
rohanpm

@Rohan - Terima kasih atas komentar Anda. Saya menghapus ini dari jawaban saya.
Kamil Szot

Itu tidak menjawab pertanyaan.
CCoder

1
Saya belum pernah melihat jawaban yang diterima dengan begitu banyak downvotes. Mengapa penulis tidak mengeditnya dalam sesuatu yang lebih baik daripada jawaban pilihan tertinggi? Suka menambahkan lebih detail? Sampai saat itu, nikmati satu lagi -1.
Tomáš Zato - Reinstate Monica

3
Tampaknya sudah diperbaiki sekarang, dan cukup bagus, jadi saya memberikan ini dan yang lainnya +1.
csl

242

Jika dikompilasi dengan kompatibilitas STL, QStringmemiliki metode statis untuk mengonversi a std::stringke QString:

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

3
Ini sebenarnya harus dihindari menurut saya. Jika versi pustaka standar QT dikompilasi dengan entah bagaimana berbeda dari apa yang Anda kompilasi, Anda akan mengalami masalah. Di menciptakan ketergantungan yang tidak perlu antara QT dan libstdc ++ yang ada di tempat lain di QT.
shoosh

@shoosh: Untuk menghindari itu, tidak bisakah seseorang melakukannya QString qstr = QString(str.c_str());? Tidak yakin apakah QStringsalinan apa yang diteruskan ke dalamnya.
Claudiu

@shoosh: Saya mengerti kekhawatiran Anda tentang kompatibilitas, tetapi QString dan std :: string dapat berisi karakter nol. fromStdStringakan melestarikan ini, membangun dari .c_strtidak akan. (Dan tepatnya bagaimana melakukan ini yang membuat saya ke pertanyaan ini.)
Martin Bonner mendukung Monica

@MartinBonner QByteArray memiliki ctor yang membutuhkan konstanta * dan panjang. QString memiliki ctor yang mengambil QByteArray
shoosh

13

Cara alternatif:

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

Ini memiliki keuntungan karena tidak menggunakan .c_str()yang dapat menyebabkan std::stringuntuk menyalin sendiri jika tidak ada tempat untuk menambahkan '\0'di akhir.


2
Terima kasih atas petunjuk tentang potensi salinan tersembunyi dengan .c_str ().
Trass3r

Dengan c ++ 11, ini tidak lagi menjadi masalah (salinan tersembunyi dengan .c_str())
Steve Lorimer

1
Sebelum C ++ 11, salinan tersembunyi potensial adalah kemungkinan teoritis murni - tidak ada implementasi yang benar-benar melakukannya.
Martin Bonner mendukung Monica

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

Peringatan: Ini tidak akan berfungsi jika std::stringmengandung \0s.


3

Saya menemukan pertanyaan ini karena saya mempunyai masalah ketika mengikuti jawaban, jadi saya memposting solusi saya di sini.

Contoh di atas semua menunjukkan sampel dengan string yang hanya berisi nilai ASCII, dalam hal ini semuanya berfungsi dengan baik. Namun, ketika berhadapan dengan string di Windows yang juga dapat berisi karakter lain, seperti umlaut Jerman, maka solusi ini tidak berfungsi

Satu-satunya kode yang memberikan hasil yang benar dalam kasus tersebut adalah

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

Jika Anda tidak harus berurusan dengan string seperti itu, maka jawaban di atas akan berfungsi dengan baik.


Ini tergantung bukan pada std :: string tetapi pengkodean file sumber Anda dengan string literal. Jika file sumber Anda adalah UTF8, itu akan berfungsi tetapi tidak memutuskan panggilan Anda kefromLocal8Bit()
namezero

0

Selain itu, untuk mengonversi apa pun yang Anda inginkan, Anda dapat menggunakan kelas QVariant.

sebagai contoh:

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();

keluaran

"hello !"
"10"
"5.42"
5

0

Apakah maksud Anda string C, seperti dalam char*string, atau objek C ++ std::string?

Either way, Anda menggunakan konstruktor yang sama, seperti yang didokumentasikan dalam referensi QT:

Untuk string C biasa, cukup gunakan konstruktor utama:

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

Untuk a std::string, Anda mendapatkan char*ke buffer dan meneruskannya ke QStringkonstruktor:

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

1
Cukup benar, meskipun OP tidak menyebutkan embedded NULLs. Jika itu diperlukan, Anda dapat menggunakannya QByteArray::QByteArray (const char* data, int size)untuk membungkus buffer terlebih dahulu, dan kemudian meneruskannya ke QStringkonstruktor.
gavinb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.