Dize QString olarak nasıl değiştirilir?


Yanıtlar:


154

Dizeyle std::stringbu yöntemi kullanarak yapabilirsiniz demek istiyorsan:

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

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

Dize ile Ascii kodlanmış demek const char *istiyorsan, bu yöntemi kullanabilirsiniz:

QString QString :: fromAscii (const char * str, int boyutu = -1)

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

Eğer varsa const char *ile okunabilir sistem kodlaması ile kodlanan QTextCodec :: codecForLocale () o zaman bu yöntemi kullanmalısınız:

QString QString :: fromLocal8Bit (sabit karakter * str, int boyutu = -1)

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

Bu const char *UTF8 kodluysa, bu yöntemi kullanmanız gerekir:

QString QString :: fromUtf8 (const char * str, int boyutu = -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 kodlu dizeyi içeren yöntem de vardır :

QString QString :: fromUtf16 (const ushort * unicode, int boyutu = -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'i `` new '' ile oluşturmak istemezsiniz.
rohanpm

@Rohan - Yorumunuz için teşekkür ederiz. Bunu cevabımdan kaldırıyorum.
Kamil Szot

Bu soruya cevap vermiyor.
CCoder

1
Hiç bu kadar aşağı oyla kabul edilmiş bir cevap görmedim. Yazar neden en yüksek oy alan cevaptan daha iyi bir şeyde düzenlemiyor? Daha fazla ayrıntı eklemek ister misiniz? O zamana kadar, bir tane daha -1 tadını çıkarın.
Tomáš Zato - Monica'yı eski durumuna getir

3
Şimdi düzeltildi ve oldukça iyi görünüyor, bu yüzden hem bunu hem de diğer +1'yi verdim.
csl

242

STL uyumluluğu ile derlenmiş ise QStringbir vardır statik yöntem bir dönüştürmek için std::stringbir için QString:

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

3
Bence bundan kaçınılmalıdır. QT'nin derlendiği standart kitaplığın sürümü, derlediğinizden farklıysa, sorun yaşayacaksınız. Içinde QT ve QT başka hiçbir yerde var libstdc ++ arasında gereksiz bir bağımlılık oluşturur.
shoosh

@shoosh: Bundan kaçınmak için sadece bir şey yapamaz QString qstr = QString(str.c_str());mıydı? QStringİçine geçirilenleri kopyalayıp kopyalamadığından emin değilim .
Claudiu

@shoosh: Uyumlulukla ilgili endişelerinizi anlıyorum, ancak hem QString hem de std :: string boş karakterler içerebilir. fromStdStringbunları koruyacak, inşa .c_stretmeyecek. (Ve bunu tam olarak nasıl yapacağım beni bu soruya götürdü.)
Martin Bonner Monica

@MartinBonner QByteArray, const char * ve uzunluk alan bir ctor'a sahiptir. QString, QByteArray alan bir ctor'a sahiptir
shoosh

13

Alternatif yol:

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

Bunun, sonunda eklenecek yer olmaması durumunda kendisini kopyalamasına .c_str()neden olabilecek şekilde kullanılmaması avantajına sahiptir .std::string'\0'


2
.C_str () ile olası gizli kopya hakkında ipucu için teşekkür ederiz.
Trass3r

C ++ 11 ile, bu artık bir endişe değil (gizli kopya ile .c_str())
Steve Lorimer

1
C ++ 11'den önce, potansiyel gizli kopya tamamen teorik bir olasılıktı - bunu aslında hiçbir uygulama yapmadı.
Martin Bonner Monica

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

Uyarı: Bu std::string, \0s içerirse çalışmaz .


3

Bu soruya rastladım çünkü cevapları takip ederken bir sorun yaşadım, bu yüzden çözümümü buraya gönderiyorum.

Yukarıdaki örneklerin tümü, yalnızca ASCII değerleri içeren dizeleri olan örnekleri gösterir; bu durumda her şey düzgün çalışır. Ancak, Windows'da Alman umlaut'ları gibi başka karakterler de içeren dizelerle uğraşırken, bu çözümler işe yaramaz

Bu gibi durumlarda doğru sonuçlar veren tek kod

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

Bu tür dizelerle uğraşmak zorunda değilseniz, yukarıdaki cevaplar işe yarayacaktır.


Bu, std :: string'e değil, kaynak dosyanızın değişmez dizeyle kodlanmasına bağlıdır. Kaynak dosyanız UTF8 ise, çalışır ancak çağrınızı fromLocal8Bit()
bozar

0

Ayrıca, istediğinizi dönüştürmek için QVariant sınıfını kullanabilirsiniz.

Örneğin:

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

çıktı

"hello !"
"10"
"5.42"
5

0

Dize gibi bir C dizesi mi char*yoksa bir C ++ std::stringnesnesi mi demek istediniz ?

Her iki durumda da, QT başvurusunda belgelendiği gibi aynı yapıcıyı kullanırsınız:

Normal bir C dizesi için sadece ana yapıcıyı kullanın:

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

A için , arabelleğe std::stringalırsınız ve char*bunu yapıcıya iletirsiniz QString:

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

1
OP gömülü NULL'lardan bahsetmese de yeterince doğru. Gerekirse, QByteArray::QByteArray (const char* data, int size)önce arabelleği sarmak ve sonra bunu yapıcıya iletmek için kullanabilirsiniz QString.
gavinb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.