كيفية تغيير السلسلة إلى QString?
سؤال
ما هو أبسط طريقة للقيام بذلك ؟
المحلول
إذا كان عن طريق سلسلة تقصد 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
يحتوي على \0
s.
وجئت عبر هذا السؤال لأنه كان لدي مشكلة عند اتباع الإجابات، ولذا فإنني الرد على بلدي الحل هنا.
والأمثلة أعلاه جميع العينات المعرض مع السلاسل التي تحتوي على قيم 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());