วิธีการเปลี่ยนสตริงเป็น QString


คำตอบ:


154

ถ้าตามสายคุณหมายความว่าstd::stringคุณสามารถทำได้ด้วยวิธีนี้:

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

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

ถ้าเป็น string หมายความว่า Ascii encoded const char *คุณสามารถใช้วิธีนี้ได้:

QString QString :: fromAscii (const char * str ขนาด int = -1)

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

หากคุณconst char *เข้ารหัสด้วยการเข้ารหัสระบบที่สามารถอ่านได้ด้วยQTextCodec :: codecForLocale ()คุณควรใช้วิธีนี้:

QString QString :: fromLocal8Bit (const char * str ขนาด int = -1)

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

หากคุณมีconst char *การเข้ารหัส UTF8 คุณจะต้องใช้วิธีนี้:

QString QString :: fromUtf8 (const char * str ขนาด int = -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);

นอกจากนี้ยังมีวิธีการconst ushort *บรรจุสตริงที่เข้ารหัส 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
คุณไม่ต้องการสร้าง QString ด้วย `ใหม่ '
rohanpm

@Rohan - ขอบคุณสำหรับความคิดเห็นของคุณ ฉันลบสิ่งนี้ออกจากคำตอบของฉัน
Kamil Szot

มันไม่ตอบคำถาม
CCoder

1
ฉันไม่เคยเห็นคำตอบที่ยอมรับพร้อมกับ downvotes มากมาย ทำไมผู้เขียนไม่แก้ไขในสิ่งที่ดีกว่าคำตอบที่โหวตสูงสุด? ต้องการเพิ่มรายละเอียดเพิ่มเติมไหม เพลิดเพลินไปกับอีกหนึ่ง -1
Tomáš Zato - Reinstate Monica

3
ดูเหมือนว่าจะได้รับการแก้ไขแล้วและค่อนข้างดีดังนั้นฉันจึงให้ทั้งนี้และอีก +1
csl

242

หากคอมไพล์ด้วยความเข้ากันได้ STL QStringมีวิธีการแบบคงที่ในการแปลงstd::stringเป็นQString:

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

3
สิ่งนี้ควรหลีกเลี่ยงในความคิดของฉัน หากเวอร์ชันของไลบรารีมาตรฐาน QT ถูกคอมไพล์ด้วยจะแตกต่างจากสิ่งที่คุณคอมไพล์ด้วยคุณจะมีปัญหา ในการสร้างการพึ่งพาที่ไม่จำเป็นระหว่าง QT และ libstdc ++ ที่ไม่มีอยู่ใน QT
shoosh

@shoosh: เพื่อหลีกเลี่ยงที่ไม่เพียงแค่ทำQString qstr = QString(str.c_str());? ไม่แน่ใจว่าQStringคัดลอกสิ่งที่ส่งเข้ามาหรือไม่
Claudiu

@shoosh: ฉันเข้าใจความกังวลของคุณเกี่ยวกับความเข้ากันได้ แต่สตริงทั้ง QString และ std :: สามารถมีอักขระเป็นโมฆะได้ fromStdStringจะเก็บสิ่งเหล่านี้จากการสร้าง.c_strไม่ได้ (และเป็นวิธีการทำเช่นนี้อย่างแม่นยำซึ่งนำฉันมาสู่คำถามนี้)
Martin Bonner สนับสนุน Monica

@MartinBonner QByteArray มี ctor ที่ใช้ const char * และความยาว QString มี ctor ที่ใช้ QByteArray
shoosh

13

ทางเลือก:

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

นี่คือข้อดีของการไม่ใช้งาน.c_str()ซึ่งอาจทำให้การstd::stringคัดลอกตัวเองในกรณีที่ไม่มีสถานที่ที่จะเพิ่ม'\0'ในตอนท้าย


2
ขอขอบคุณสำหรับคำแนะนำเกี่ยวกับสำเนาที่ซ่อนอยู่ที่อาจเป็นไปได้ด้วย. c_str ()
Trass3r

ด้วย c ++ 11 สิ่งนี้จะไม่เป็นข้อกังวลอีกต่อไป (สำเนาที่ซ่อนอยู่.c_str())
Steve Lorimer

1
ก่อนถึง C ++ 11 สำเนาซ่อนเร้นที่เป็นไปได้นั้นมีความเป็นไปได้ทางทฤษฎีล้วนๆไม่มีการใช้งานจริง
Martin Bonner สนับสนุน Monica

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

คำเตือน:สิ่งนี้จะไม่ทำงานหากstd::stringมี\0รายการ


3

ฉันเจอคำถามนี้เพราะฉันมีปัญหาเมื่อทำตามคำตอบดังนั้นฉันโพสต์คำตอบของฉันที่นี่

ตัวอย่างข้างต้นทั้งหมดแสดงตัวอย่างพร้อมสตริงที่มีค่า ASCII เท่านั้นซึ่งทุกอย่างทำงานได้ดี อย่างไรก็ตามเมื่อจัดการกับสตริงใน Windows ซึ่งสามารถมีอักขระอื่น ๆ เช่น umlauts ภาษาเยอรมันได้ดังนั้นโซลูชันเหล่านี้จึงใช้ไม่ได้

รหัสเดียวที่ให้ผลลัพธ์ที่ถูกต้องในกรณีเช่นนี้คือ

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

หากคุณไม่ต้องจัดการกับสตริงดังกล่าวคำตอบข้างต้นจะใช้ได้ดี


สิ่งนี้ขึ้นอยู่กับ std :: string แต่การเข้ารหัสไฟล์ต้นฉบับของคุณด้วยตัวอักษรสตริง หากไฟล์ต้นฉบับของคุณคือ UTF8 มันจะทำงาน แต่ไม่สามารถโทรไปที่fromLocal8Bit()
namezero

0

นอกจากนี้ในการแปลงสิ่งที่คุณต้องการคุณสามารถใช้คลาส QVariant

ตัวอย่างเช่น:

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

เอาท์พุต

"hello !"
"10"
"5.42"
5

0

คุณหมายถึงสตริง C เช่นเดียวกับในchar*สตริงหรือstd::stringวัตถุC ++ ?

ไม่ว่าจะใช้วิธีใดคุณใช้ Constructor เดียวกันตามที่ระบุไว้ในเอกสารอ้างอิง QT:

สำหรับสตริง C ปกติให้ใช้ตัวสร้างหลัก:

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

สำหรับ a std::stringคุณจะได้รับchar*บัฟเฟอร์และส่งต่อไปยังQStringconstructor:

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

1
จริงพอถึงแม้ว่า OP ไม่ได้พูดถึง NULL ที่ฝังอยู่ ถ้าจำเป็นคุณสามารถใช้QByteArray::QByteArray (const char* data, int size)เพื่อตัดบัฟเฟอร์ก่อนแล้วจึงส่งไปยังตัวQStringสร้าง
gavinb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.