स्ट्रिंग को QString में कैसे बदलें?


जवाबों:


154

यदि स्ट्रिंग से आपका मतलब है कि std::stringआप इसे इस विधि से कर सकते हैं:

QString QString :: fromStdString (const std :: string और str)

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

यदि स्ट्रिंग से आपका मतलब है कि असीसी एनकोडेड है const char *तो आप इस विधि का उपयोग कर सकते हैं:

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

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

यदि आपने const char *सिस्टम एन्कोडिंग के साथ कूटबद्ध किया है जिसे क्यूटेक्स्टकोड के साथ पढ़ा जा सकता है :: codecForLocale () तो आपको इस विधि का उपयोग करना चाहिए:

QString QString :: fromLocal8Bit (const char * str, int size = -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 size = -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 * unicode, int size = -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 का निर्माण 'नए' के ​​साथ नहीं करना चाहेंगे।
रोहन दोपहर

@ रोहन - आपकी टिप्पणी के लिए धन्यवाद। मैं इसे अपने उत्तर से हटा रहा हूं।
कामिल सजोट

यह प्रश्न का उत्तर नहीं देता है।
CCoder

1
मैंने इतने सारे डाउनवॉट के साथ कभी भी स्वीकृत उत्तर नहीं देखा। सबसे ज्यादा वोट किए गए उत्तर की तुलना में लेखक इसे बेहतर तरीके से संपादित क्यों नहीं करता है? अधिक विस्तार जोड़ने की तरह? तब तक, एक और 1 का आनंद लें।
टॉम ज़ातो -

3
ऐसा लगता है कि यह अब ठीक हो गया है, और बहुत अच्छा है, इसलिए मैंने यह और दूसरा +1 दिया।
सीएसएल

242

यदि एसटीएल संगतता के साथ संकलित किया गया है, तो एक को एक में बदलने के लिए QStringएक स्थिर विधिstd::string है QString:

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

3
यह वास्तव में मेरी राय में बचा जाना चाहिए। यदि मानक पुस्तकालय क्यूटी के संस्करण के साथ संकलित किया गया था, तो आप जो कुछ भी संकलित कर रहे हैं, उससे अलग है, तो आपको परेशानी होने वाली है। क्यूटी और libstdc ++ के बीच एक अनावश्यक निर्भरता पैदा करता है जो क्यूटी में कहीं और मौजूद है।
शौप

@ शशोश: इससे बचने के लिए कोई ऐसा नहीं कर सकता है QString qstr = QString(str.c_str());? निश्चित नहीं है कि क्या QStringप्रतियां इसमें पारित हुई हैं।
क्लाउडीयू

@ आशुतोष: मैं आपकी चिंताओं को कम्फ़र्टिबिलिटी के बारे में समझता हूं, लेकिन QString और std :: string दोनों में अशक्त अक्षर हो सकते हैं। fromStdStringइनका संरक्षण करेगा, जिससे निर्माण नहीं .c_strहोगा। (और यह ठीक था कि ऐसा कैसे किया जाए जिससे मुझे इस सवाल
का

@MartinBonner QByteArray में एक ctor है जो const char * और लंबाई लेता है। QString में एक Ctor होता है जो QByteArray
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 () के साथ संभावित छिपी प्रतिलिपि के बारे में संकेत के लिए धन्यवाद।
13

सी ++ 11 के साथ, यह अब कोई चिंता नहीं है (छिपी हुई प्रति .c_str())
स्टीव लोरिमर

1
C ++ 11 से पहले, संभावित छिपी हुई प्रतिलिपि एक विशुद्ध सैद्धांतिक संभावना थी - वास्तव में किसी भी कार्यान्वयन ने ऐसा नहीं किया।
मार्टिन बोनर

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

चेतावनी: इसमें काम नहीं होगा यदि s std::stringशामिल है \0


3

मैं इस सवाल के कारण आया क्योंकि मुझे उत्तर का पालन करते समय एक समस्या थी, इसलिए मैं यहां अपना समाधान पोस्ट करता हूं।

उपरोक्त उदाहरण सभी ASCII मूल्यों वाले स्ट्रिंग्स के साथ नमूने दिखाते हैं, जिस स्थिति में सब कुछ ठीक काम करता है। हालाँकि, जब Windows whcih में तार के साथ काम करने में जर्मन umlauts जैसे अन्य वर्ण भी हो सकते हैं, तो ये समाधान काम नहीं करते हैं

एकमात्र कोड जो ऐसे मामलों में सही परिणाम देता है

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*स्ट्रिंग में, या सी ++ std::stringऑब्जेक्ट?

किसी भी तरह से, आप एक ही निर्माता का उपयोग करते हैं, क्यूटी संदर्भ में प्रलेखित:

एक नियमित C स्ट्रिंग के लिए, बस मुख्य कंस्ट्रक्टर का उपयोग करें:

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

A के लिए std::string, आप char*बफर को प्राप्त करते हैं और उसे QStringकंस्ट्रक्टर के पास भेजते हैं:

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

1
यह पर्याप्त है, हालांकि ओपी ने एम्बेडेड NULLs का उल्लेख नहीं किया है। यदि यह आवश्यक है, तो आप QByteArray::QByteArray (const char* data, int size)पहले बफर को लपेटने के लिए उपयोग कर सकते हैं , और फिर QStringनिर्माणकर्ता को पास कर सकते हैं ।
गैविनब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.