วิธีการแปลง QString เป็น std :: string?


229

ฉันพยายามทำสิ่งนี้:

QString string;
// do things...
std::cout << string << std::endl;

แต่รหัสไม่ได้รวบรวม วิธีการส่งออกเนื้อหาของ qstring ลงในคอนโซล (เช่นสำหรับการแก้ไขจุดบกพร่องหรือเหตุผลอื่น ๆ )? วิธีการแปลงQStringเป็นstd::string?

คำตอบ:


222

หนึ่งในสิ่งที่คุณควรจำไว้เมื่อมีการแปลงQStringไปstd::stringเป็นความจริงที่QStringเป็น UTF-16 ในขณะที่การเข้ารหัสstd::string... อาจจะมีการเข้ารหัสใด ๆ

ดังนั้นสิ่งที่ดีที่สุดคือ:

QString qs;

// Either this if you use UTF-8 anywhere
std::string utf8_text = qs.toUtf8().constData();

// or this if you're on Windows :-)
std::string current_locale_text = qs.toLocal8Bit().constData();

วิธีที่แนะนำ (ยอมรับ) อาจใช้งานได้หากคุณระบุตัวแปลงสัญญาณ

ดู: http://doc.qt.io/qt-5/qstring.html#toLatin1


สิ่งนี้ไม่ปลอดภัย & ช้ากว่าวิธีที่เหมาะสมเล็กน้อย คุณกำลังเข้าถึงข้อมูลของ QByteArray ที่สร้างขึ้นในสแต็ก destructor สำหรับ QByteArray อาจถูกเรียกก่อนตัวสร้างของสตริง STL วิธีที่ปลอดภัยที่สุดในการสร้างฟังก์ชั่นตัวช่วย static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali

17
@Vitali ไม่ถูกต้อง "ตัวทำลายสำหรับ QByteArray อาจถูกเรียกก่อนตัวสร้างของสตริง STL" ไม่ใช่คำสั่งที่ถูกต้อง: การอ้างอิงมาตรฐาน: 12.2.3 วัตถุชั่วคราวจะถูกทำลายเป็นขั้นตอนสุดท้ายในการประเมินการแสดงออกแบบเต็ม (1.9) มีจุดที่พวกเขาถูกสร้างขึ้น และการแสดงออกอย่างเต็มที่มีstd::string utf8_text = qs.toUtf8().constData();ดังนั้นคำสั่งของคุณไม่ถูกต้อง
Artyom

นั่นเป็นความจริง - ฉันกำลังคิดเกี่ยวกับ const char * x = qs.ToUtf8 (). constData () ถึงกระนั้นการเรียก qs.toStdString () นั้นง่ายกว่าไหม?
Vitali

6
@Vitali No. ที่สูญเสียอักขระที่ไม่ใช่ latin1 QString s = QString::fromUtf8("árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"); std::cout << s.toStdString() << std::endl; std::cout << s.toUtf8().constData() << std::endl;ลองนี้: ครั้งแรกไม่ถูกต้องที่สองที่สมบูรณ์แบบ คุณต้องการเทอร์มินัล utf8 เพื่อทดสอบสิ่งนี้
Notinlist

3
สำหรับสิ่งที่มีค่า.toStdString()สำหรับฉันมักจะส่งผลให้เกิดการละเมิดการเข้าถึงในผู้ประกอบการท่อโดยไม่คำนึงถึงQStringเนื้อหาของ (ไม่ใช่ละติน 1 หรือไม่) นี่คือ Qt 4.8.3 / MSVC ++ 10 / Win 7
Daniel Saner

269

คุณสามารถใช้ได้:

QString qs;
// do things
std::cout << qs.toStdString() << std::endl;

ภายในใช้ฟังก์ชัน QString :: toUtf8 () เพื่อสร้าง std :: string ดังนั้นจึงเป็น Unicode ที่ปลอดภัยเช่นกัน ต่อไปนี้เป็นQStringเอกสารอ้างอิงสำหรับ


73
ตั้งแต่ Qt 5.0 QString::toStdString()ตอนนี้ใช้QString::toUtf8()เพื่อทำการแปลงดังนั้นคุณสมบัติ Unicode ของสตริงจะไม่สูญหาย ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString )
Emile Cormier

และถ้าคุณต้องการที่จะตรวจสอบรหัสที่มาสำหรับQString::toStdString, ที่นี่มันเป็น
thuga

1
ฉันจะทดสอบเพื่อดูว่าจริง ๆ แล้วสูญเสียคุณสมบัติ Unicode ได้อย่างไร การใช้อักขระ Unicode (เช่นพูดจากภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ) จะทำอย่างไร
Yousuf Azad

35

ถ้าจุดมุ่งหมายสูงสุดของคุณคือการได้รับการแก้จุดบกพร่องข้อความไปยังคอนโซลคุณสามารถใช้qDebug ()

คุณสามารถใช้เช่น

qDebug()<<string;ซึ่งจะพิมพ์เนื้อหาไปยังคอนโซล

วิธีนี้ดีกว่าการแปลงเป็นstd::stringข้อความเพื่อแก้ไขข้อบกพร่อง


1
qDebug () จะดีกว่ามากเพราะรองรับประเภท Qt ได้มากขึ้น
Kamil Klimek

24
QString qstr;
std::string str = qstr.toStdString();

อย่างไรก็ตามหากคุณใช้ Qt:

QTextStream out(stdout);
out << qstr;

ฉันลอง << qstr ก่อนก่อนถาม แต่มันไม่ได้รวบรวม มันทำงานร่วมกับ qstr.toStdString () ได้
กัส

2
ฉันไม่คิดอย่างนั้น คุณลอง std :: cout << qstr ไม่ใช่ QTextString (stdout) << qstr;
chris

18

สิ่งที่ดีที่สุดที่จะทำคือการโอเวอร์โหลดตัวดำเนินการ << ด้วยตัวคุณเองเพื่อให้ QString สามารถส่งเป็นชนิดไปยังไลบรารีใด ๆ ที่ต้องการประเภทเอาต์พุตที่สามารถทำได้

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}

3
ทำไมการลงคะแนนคน? มันเป็น overkill ในกรณีของฉัน แต่ใครจะรู้มันอาจจะมีประโยชน์ (สำหรับฉันหรือคนอื่น)
กัสติน

ฉันชอบสิ่งนี้เพราะ Qt มีนิสัยในการเปลี่ยนวิธีการทำงานของสาย - และสิ่งนี้ทำให้การแปลงเป็นที่เดียว
Den-Jason

12

ทางเลือกที่เสนอ:

QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();

อาจจะเป็น:

QString qs;
std::string current_locale_text = qPrintable(qs);

ดูเอกสาร qPrintableแมโครที่ส่ง const char * จาก QtGlobal


2
ใช้ได้แม้กับ Qt-Build พร้อม-no-stlชุด -Option ข้อมูลเพิ่มเติม
Senči


2

คุณสามารถใช้สิ่งนี้;

QString data;
data.toStdString().c_str();

โปรดเพิ่มรายละเอียดเกี่ยวกับความผิดพลาดและทำไมคำตอบของคุณจึงใช้ได้
Anantha Raju C

0
 QString data;
   data.toStdString().c_str();

ยังสามารถส่งข้อยกเว้นในคอมไพเลอร์ VS2017 ใน xstring

 ~basic_string() _NOEXCEPT
        {   // destroy the string
        _Tidy_deallocate();
        }

วิธีที่ถูกต้อง (ปลอดภัย - ไม่มีข้อยกเว้น) คือวิธีการอธิบายข้างต้นจาก Artyom

 QString qs;

    // Either this if you use UTF-8 anywhere
    std::string utf8_text = qs.toUtf8().constData();

    // or this if you're on Windows :-)
    std::string current_locale_text = qs.toLocal8Bit().constData();

-1

ลองสิ่งนี้:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;

1
คำถามชัดเจนมาก: แปลง QString เป็น std :: string, ไม่ใช่พิมพ์
eyllanesc

@eyllanesc ข้อความคำถามพูดว่า "วิธีการส่งออกเนื้อหาของ qstring ลงในคอนโซล?" ดูเหมือนว่า OP จะถือว่าการแปลงเป็น std :: string เป็นวิธีเดียว มันเป็นคำถามสองข้อที่ถูกถามพร้อมกัน
MM

@MM คำถามดูเหมือนไม่ชัดเจนเนื่องจากคำถามในชื่อกล่าวว่าจะแปลง QString เป็น std :: string ได้อย่างไร บางทีมันอาจเป็นปัญหา XY
eyllanesc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.