Як змінити рядок на QString?


Відповіді:


154

Якщо під рядком ви маєте на увазі, 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);

1
Ви не хочете конструювати QString за допомогою "new".
rohanpm

@Rohan - Дякую за коментар Я знімаю це зі своєї відповіді.
Каміль Шот

Це не дає відповіді на запитання.
CCoder

1
Я ніколи не бачив прийнятої відповіді з такою кількістю голосів. Чому автор не редагує це в чомусь кращому за найкращу відповідь? Як додати більше деталей? До цього часу насолоджуйтесь ще одним -1.
Томаш Зато - Відновіть Моніку

3
Здається, це виправлено зараз, і це дуже добре, тому я дав і те, і інше +1.
csl

242

Якщо компільовано зі сумісністю STL, QStringє статичний метод перетворення a std::stringв QString:

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

3
Насправді цього слід уникати, на мою думку. Якщо версія стандартної бібліотеки QT, складена з якимось чином, відрізняється від того, що ви компілюєте, у вас виникнуть проблеми. У створюється непотрібна залежність між QT та libstdc ++, яка більше ніде в QT не існує.
shoosh

@shoosh: Щоб цього не можна було просто зробити QString qstr = QString(str.c_str());? Не впевнений, чи QStringкопіює те, що передано в нього.
Клавдіу

@shoosh: Я розумію, що ви занепокоєні щодо сумісності, але QString і std :: string можуть містити нульові символи. fromStdStringзбережемо їх, будуючи з .c_strне буде. (І саме як це зробити, мене спонукало до цього питання.)
Мартін Боннер підтримує Моніку

@MartinBonner QByteArray має ctor, що займає const char * та довжину. QString має ctor, який приймає
QByteArray

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 ().
Trass3r

З c ++ 11 це вже не викликає занепокоєння (прихована копія .c_str())
Стів Лоример

1
До C ++ 11 потенційна прихована копія була суто теоретичною можливістю - жодна реалізація насправді цього не робила.
Мартін Боннер підтримує Моніку

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

Попередження: Це не працюватиме, якщо std::stringмістить \0s.


3

Я натрапив на це питання, оскільки у мене виникли проблеми, коли слідкували за відповідями, тому я розміщую тут своє рішення.

Наведені вище приклади показують зразки з рядками, що містять лише значення ASCII, і в цьому випадку все працює добре. Однак, якщо мати справу з рядками в Windows, які також можуть містити інші символи, наприклад, німецькі umlauts, ці рішення не працюють

Єдиний код, який дає правильні результати в таких випадках - це

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

Якщо вам не доведеться мати справу з такими рядками, то наведені вище відповіді спрацюють чудово.


Це залежить не від std :: string, а від кодування вихідного файлу з літеральним рядком. Якщо ваш вихідний файл - UTF8, він буде працювати, але fromLocal8Bit()
перерве

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

Ви маєте на увазі рядок C, як у char*рядку, або об'єкт C ++ std::string?

У будь-якому випадку ви використовуєте той самий конструктор, як це зафіксовано у посиланні на QT:

Для звичайного рядка C просто використовуйте головний конструктор:

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

Для a std::string, ви отримуєте char*буфер і передаєте його QStringконструктору:

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

1
Щоправда, хоча ОП не згадувала про вбудовані NULL. Якщо це потрібно, ви можете QByteArray::QByteArray (const char* data, int size)спочатку обернути буфер, а потім передати його QStringконструктору.
gavinb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.