QString을 std :: string로 변환하는 방법?


229

나는 이런 식으로하려고합니다.

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

그러나 코드는 컴파일되지 않습니다. qstring의 내용을 콘솔에 출력하는 방법 (예 : 디버깅 목적 또는 기타 이유로)? 어떻게 변환하기 QStringstd::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의 데이터에 액세스하고 있습니다. QByteArray의 소멸자는 STL 문자열의 생성자보다 먼저 호출 될 수 있습니다. 도우미 기능을 만드는 가장 안전한 방법입니다. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali

17
@Vitali가 올바르지 않습니다. "STL 문자열의 생성자 전에 QByteArray의 소멸자가 호출 될 수 있습니다."가 올바르지 않습니다. 생성 된 지점을 포함합니다. 그리고 완전한 표현이 있습니다 std::string utf8_text = qs.toUtf8().constData();그래서 당신의 진술이 정확하지 않습니다
Artyom

사실입니다-const char * x = qs.ToUtf8 (). constData ()에 대해 생각하고있었습니다. 아직도 qs.toStdString ()을 호출하는 것이 쉽지 않습니까?
Vitali

6
@Vitali No. 비 라틴 1 문자를 잃습니다. 이것을 시도하십시오 : 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(latin1이 아닌지 여부와 상관없이) 파이프 연산자에서 액세스 위반이 발생합니다 . 이것은 Qt는에서 4.8.3 / MSVC ++ 10 / 윈 7입니다
다니엘 온건

269

당신이 사용할 수있는:

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

내부적으로 QString :: toUtf8 () 함수를 사용하여 std :: string을 생성하므로 유니 코드도 안전합니다. 대한 참조 문서는 다음과 같습니다QString .


73
Qt 5.0 QString::toStdString()부터는 QString::toUtf8()변환을 수행하는 데 사용 되므로 문자열의 유니 코드 속성이 손실되지 않습니다 ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Emile Cormier

당신의 소스 코드를 확인하고자한다면 QString::toStdString, 여기 있습니다 .
thuga

1
유니 코드 속성이 실제로 손실되는지 확인하려면 어떻게해야합니까? 유니 코드 문자를 사용하면 (예 : 영어 이외의 언어로 말하면)?
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 ()과 함께 작동합니다.
augustin

2
나는 그렇게 생각하지 않습니다. std :: cout << qstr을 시도했지만 QTextString (stdout) << qstr이 아닙니다.
chris

18

가장 좋은 방법은 연산자 << 자신을 오버로드하여 QString을 출력 가능한 유형을 기대하는 모든 라이브러리에 유형으로 전달할 수 있도록하는 것입니다.

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

3
왜 다운 투표, 사람들? 내 경우에는 과잉이지만 누가 알더라도 유용 할 수 있습니다 (나 또는 다른 사람에게).
augustin

Qt는 문자열이 작동하는 방식을 바꾸는 습관을 가지고 있기 때문에 이것을 좋아합니다.
Den-Jason

12

제안 된 대안 :

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

될 수 있습니다 :

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

QtGlobal 에서 const char *를 전달하는 매크로 인 qPrintable documentation을 참조하십시오 .


2
이것은 -no-stl-Option이 설정된 Qt-Build에서도 작동합니다 . 더 많은 정보
Senči

8

가장 간단한 방법은입니다 QString::toStdString().



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

xstring의 VS2017 컴파일러에서 예외를 던질 수도 있습니다.

 ~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.