Bunu yapmanın en temel yolu nedir?
Bunu yapmanın en temel yolu nedir?
Yanıtlar:
Dizeyle std::string
bu 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);
STL uyumluluğu ile derlenmiş ise QString
bir vardır statik yöntem bir dönüştürmek için std::string
bir için QString
:
std::string str = "abc";
QString qstr = QString::fromStdString(str);
QString qstr = QString(str.c_str());
mıydı? QString
İçine geçirilenleri kopyalayıp kopyalamadığından emin değilim .
fromStdString
bunları koruyacak, inşa .c_str
etmeyecek. (Ve bunu tam olarak nasıl yapacağım beni bu soruya götürdü.)
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'
.c_str()
)
std::string s = "Sambuca";
QString q = s.c_str();
Uyarı: Bu std::string
, \0
s içerirse çalışmaz .
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.
fromLocal8Bit()
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
Dize gibi bir C dizesi mi char*
yoksa bir C ++ std::string
nesnesi 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::string
alırsınız ve char*
bunu yapıcıya iletirsiniz QString
:
std::string name2("Stack Overflow");
QString qname2(name2.c_str());
QByteArray::QByteArray (const char* data, int size)
önce arabelleği sarmak ve sonra bunu yapıcıya iletmek için kullanabilirsiniz QString
.