문자열을 QString으로 변경하는 방법은 무엇입니까?


답변:


154

문자열로 말하면 std::string이 방법으로 할 수 있음을 의미 합니다.

QString QString :: fromStdString (const 표준 :: 문자열 및 str)

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

문자열로 Ascii 인코딩 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 * 유니 코드, 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
`new '로 QString을 구성하고 싶지 않을 것입니다.
rohanpm

@Rohan-귀하의 의견에 감사드립니다. 내 답변에서 이것을 제거하고 있습니다.
카밀 쇼트

질문에 대답하지 않습니다.
CCoder

1
너무 많은 다운 보트가 허용되는 답변을 본 적이 없습니다. 작성자가 가장 높은 투표 답변보다 더 나은 내용으로 편집하지 않는 이유는 무엇입니까? 더 자세한 내용을 추가하고 싶으십니까? 그때까지 -1을 더 즐기십시오.
Tomáš Zato-복원 자 Monica Monica

3
지금은 고정 된 것으로 보이며 꽤 좋습니다. 그래서 나는 이것과 다른 +1을 주었다.
csl

242

STL 호환성을 컴파일하는 경우, QString정적 메서드 을 변환하는 std::stringA를을 QString:

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

3
이것은 실제로 제 생각에는 피해야합니다. 표준 라이브러리 QT의 버전이 컴파일 된 버전과 다른 경우 문제가 발생합니다. In은 QT에 존재하지 않는 QT와 libstdc ++간에 불필요한 종속성을 만듭니다.
shoosh

@ shoosh : 그것을 피하기 위해 그냥 할 수 없었 QString qstr = QString(str.c_str());습니까? QString전달 된 내용이 복사되는지 확실하지 않습니다 .
Claudiu

@ shoosh : 호환성에 대한 귀하의 우려를 이해하지만 QString과 std :: string 모두 널 문자를 포함 할 수 있습니다. fromStdString유지 .c_str하지 않을 것입니다. (그리고이 질문에 나를 인도하는이 작업을 수행하는 방법을 정확하게이었다.)
마틴 보너 모니카 지원

@MartinBonner QByteArray에는 const char *와 길이를 사용하는 ctor가 있습니다. QString은 QByteArray 소요 ctor에있다
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())
스티브 Lorimer가

1
C ++ 11 이전에는 잠재적으로 숨겨진 사본이 이론적으로 가능했습니다. 실제로는 구현이 없었습니다.
Martin Bonner는 Monica

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

경고 :에std::string포함되어 있으면 작동하지 않습니다 \0.


3

답변을 따를 때 문제가 발생 하여이 질문을 보았으므로 여기에 솔루션을 게시하십시오.

위의 예제는 모두 ASCII 값만 포함하는 문자열이있는 샘플을 보여줍니다.이 경우 모든 것이 제대로 작동합니다. 그러나 Windows에서 문자열을 처리 할 때 whcih는 독일어 움라우트와 같은 다른 문자를 포함 할 수 있습니다. 이러한 솔루션은 작동하지 않습니다

이러한 경우 올바른 결과를 제공하는 유일한 코드는

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

char*문자열이나 C ++ std::string객체 에서와 같이 C 문자열을 의미 합니까?

어느 쪽이든 QT 참조에 설명 된 것과 동일한 생성자를 사용합니다.

일반 C 문자열의 경우 기본 생성자를 사용하십시오.

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

의 경우 버퍼 std::string를 가져 와서 생성자 char*에게 전달합니다 QString.

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.