سؤال

ما هو أبسط طريقة للقيام بذلك ؟

هل كانت مفيدة؟

المحلول

إذا كان عن طريق سلسلة تقصد std::string يمكنك أن تفعل ذلك مع هذا الأسلوب:

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

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

إذا كان عن طريق سلسلة تعني ترميز Ascii const char * ثم يمكنك استخدام هذه الطريقة:

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

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

إذا كان لديك const char * ترميز مع نظام الترميز التي يمكن قراءتها مع QTextCodec::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);

نصائح أخرى

إذا جمعت مع التوافق STL، QString لديه ثابت ل تحويل std::string إلى QString:

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

والطريقة البديلة:

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

وهذا له ميزة عدم استخدام .c_str() التي قد تتسبب في std::string لنسخ نفسها في حالة عدم وجود مكان لإضافة '\0' في نهاية المطاف.

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

تحذير: هذا لن يعمل إذا كان std::string يحتوي على \0s.

وجئت عبر هذا السؤال لأنه كان لدي مشكلة عند اتباع الإجابات، ولذا فإنني الرد على بلدي الحل هنا.

والأمثلة أعلاه جميع العينات المعرض مع السلاسل التي تحتوي على قيم ASCII فقط، وفي هذه الحالة كل شيء يعمل بشكل جيد. ومع ذلك، عند التعامل مع السلاسل في ويندوز whcih يمكن أن تحتوي أيضا على الشخصيات الأخرى، مثل علامات تغير في الصوت الألمانية، فإن هذه الحلول لا تعمل

والرمز الوحيد الذي يعطي النتائج الصحيحة في مثل هذه الحالات هو

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

إذا لم يكن لديك للتعامل مع مثل هذه السلاسل، ثم الإجابات أعلاه سوف تعمل بشكل جيد.

وعلاوة على ذلك، لتحويل ما تريد، يمكنك استخدام فئة 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

تعني سلسلة C ، كما في char* سلسلة أو C++ std::string الكائن ؟

إما الطريقة ، يمكنك استخدام نفس المنشئ ، كما هو موثق في QT المرجعية:

بالنسبة منتظم C string, مجرد استخدام الرئيسية منشئ:

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

عن std::string, الحصول على char* إلى المخزن المؤقت وتمرير ذلك إلى QString المنشئ:

std::string name2("Stack Overflow");
QString qname2(name2.c_str());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top