Làm cách nào để chuyển đổi QString thành std :: string?


229

Tôi đang cố gắng làm một cái gì đó như thế này:

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

nhưng mã không biên dịch. Làm cách nào để xuất nội dung của chuỗi vào bảng điều khiển (ví dụ: cho mục đích gỡ lỗi hoặc các lý do khác)? Làm thế nào để chuyển đổi QStringsang std::string?

Câu trả lời:


223

Một trong những điều bạn nên nhớ khi chuyển đổi QStringthành std::stringthực tế QStringlà UTF-16 được mã hóa trong khi std::string... Có thể có bất kỳ mã hóa nào.

Vì vậy, tốt nhất sẽ là:

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

Phương thức được đề xuất (được chấp nhận) có thể hoạt động nếu bạn chỉ định codec.

Xem: http://doc.qt.io/qt-5/qopes.html#toLatin1


Điều này không an toàn và chậm hơn một chút so với cách thích hợp. Bạn đang truy cập dữ liệu của QByteArray được tạo trên ngăn xếp. Hàm hủy cho QByteArray có thể được gọi trước hàm tạo của chuỗi STL. Cách an toàn nhất để tạo ra một chức năng trợ giúp. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali

17
@Vitali không đúng. "Hàm hủy cho QByteArray có thể được gọi trước hàm tạo của chuỗi STL" không phải là câu lệnh đúng: Trích dẫn tiêu chuẩn: 12.2.3 Các đối tượng tạm thời bị phá hủy là bước cuối cùng trong việc đánh giá biểu thức đầy đủ (1.9) mà (theo từ vựng) chứa điểm mà chúng được tạo ra. Và biểu thức đầy đủ là std::string utf8_text = qs.toUtf8().constData();Vì vậy, tuyên bố của bạn không chính xác
Artyom

Điều đó đúng - tôi đã suy nghĩ về const char * x = qs.ToUtf8 (). ConstData (). Tuy nhiên, việc gọi qs.toStdString () có dễ hơn không?
Vitali

6
@Vitali Không. Mất các ký tự không phải là latin1. Hãy thử điều này : 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;. Thứ nhất là không chính xác, thứ hai là hoàn hảo. Bạn cần một thiết bị đầu cuối utf8 để kiểm tra điều này.
Notinlist

3
Đối với những gì nó có giá trị, .toStdString()đối với tôi luôn dẫn đến vi phạm truy cập trong toán tử đường ống, bất kể QStringnội dung của (không phải là latin1 hay không). Đây là trên Qt 4.8.3 / MSVC ++ 10 / Win 7.
Daniel Saner

269

Bạn có thể dùng:

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

Nó sử dụng hàm QString :: toUtf8 () trong nội bộ để tạo chuỗi std ::, do đó, Unicode cũng an toàn. Đây là tài liệu tham khảo cho QString.


73
Kể từ Qt 5.0, QString::toStdString()hiện sử dụng QString::toUtf8()để thực hiện chuyển đổi, do đó, các thuộc tính Unicode của chuỗi sẽ không bị mất ( qt-project.org/doc/qt-5.0/qtcore/qopes.html#toStdString ).
Cileier Cormier

Và nếu bạn muốn kiểm tra mã nguồn QString::toStdString, đây là .
thuga

1
Làm thế nào tôi có thể kiểm tra để xem nếu nó thực sự mất thuộc tính Unicode? Việc sử dụng các ký tự Unicode (ví dụ: nói từ một ngôn ngữ khác tiếng Anh) sẽ làm gì?
Yousuf Azad

35

Nếu mục đích cuối cùng của bạn là nhận thông báo gỡ lỗi cho bảng điều khiển, bạn có thể sử dụng qDebug () .

Bạn có thể sử dụng như,

qDebug()<<string;Nó sẽ in nội dung ra bàn điều khiển .

Cách này tốt hơn là chuyển đổi nó thành std::stringchỉ vì mục đích gỡ lỗi tin nhắn.


1
qDebug () sẽ tốt hơn nhiều, vì nó hỗ trợ nhiều loại Qt hơn.
Kamil Klimek

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

Tuy nhiên, nếu bạn đang sử dụng Qt:

QTextStream out(stdout);
out << qstr;

Tôi đã thử << qstr trước, trước khi hỏi, nhưng nó không được biên dịch. Mặc dù vậy, nó hoạt động với qstr.toStdString ().
augustin

2
Tôi không nghĩ vậy. Bạn đã thử std :: cout << qstr, không phải QTextString (stdout) << qstr;
chris

18

Điều tốt nhất nên làm là quá tải toán tử << chính bạn, để QString có thể được chuyển thành một loại cho bất kỳ thư viện nào mong đợi loại có thể xuất ra.

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

3
Tại sao các phiếu giảm, folks? Đó là một sự quá mức trong trường hợp của tôi, nhưng ai biết được, nó có thể hữu ích (với tôi hoặc người khác).
augustin

Tôi thích điều này bởi vì Qt có thói quen thay đổi cách thức hoạt động của chuỗi - và điều này đặt chuyển đổi ở một nơi.
Den-Jason

12

Một thay thế cho đề xuất:

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

có thể là:

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

Xem tài liệu qPrintable , một macro cung cấp const char * từ QtGlobal.


2
điều này hoạt động ngay cả với bộ Qt-Build với -no-stl-Option. một số thông tin thêm
Senči


2

Bạn có thể sử dụng cái này;

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

vui lòng thêm một số chi tiết về lỗi là gì và tại sao câu trả lời của bạn hoạt động
Anantha Raju C

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

thậm chí có thể ném ngoại lệ vào trình biên dịch VS2017 trong chuỗi

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

đúng cách (an toàn - không có ngoại lệ) là cách giải thích ở trên từ 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

Thử cái này:

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

1
Câu hỏi rất rõ ràng: chuyển đổi QString thành std :: string, không in nó.
Eyllanesc

@eyllanesc văn bản câu hỏi cho biết "Làm thế nào để xuất nội dung của chuỗi ký tự vào bảng điều khiển?" , có vẻ như OP giả định chuyển đổi sang std :: string là cách duy nhất. Đó thực sự là hai câu hỏi được hỏi cùng một lúc.
MM

@MM Câu hỏi dường như không rõ ràng vì câu hỏi trong tiêu đề cho biết Làm thế nào để chuyển đổi QString thành std :: string? , Có lẽ đó là một vấn đề XY.
Eyllanesc
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.