Как изменить строку в 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 - Спасибо за ваш комментарий. Я убираю это из своего ответа.
Камил Сзот
Это не отвечает на вопрос.
Кодер
1
Я никогда не видел принятого ответа с таким большим количеством отрицательных ответов. Почему автор не редактирует это в чем-то лучше, чем ответ с наибольшим количеством голосов? Как добавить больше деталей? До тех пор наслаждайтесь еще одним -1.
Томаш Зато - Восстановить Монику
3
Кажется, это исправлено и довольно хорошо, поэтому я дал +1 и этому, и другому.
csl
242

Если скомпилировано с совместимостью с STL, QStringимеет статический метод для преобразования a std::stringв QString:

std::string str = "abc";
QString qstr = QString::fromStdString(str);
STH
источник
3
На самом деле этого следует избегать, по моему мнению. Если версия стандартной библиотеки, с которой был скомпилирован QT, чем-то отличается от той, с которой вы компилируете, у вас будут проблемы. In создает ненужную зависимость между 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
shoosh
13

Альтернативный способ:

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

Это имеет преимущество в том, что не используется, .c_str()что может привести std::stringк копированию самого себя, если '\0'в конце нет места для добавления .

shoosh
источник
2
Спасибо за подсказку о потенциальной скрытой копии с помощью .c_str ().
Trass3r
С c ++ 11 это больше не проблема (скрытая копия с .c_str())
Стив Лоример
1
До C ++ 11 потенциальная скрытая копия была чисто теоретической возможностью - на самом деле ни одна реализация не делала этого.
Мартин Боннер поддерживает Монику
11
std::string s = "Sambuca";
QString q = s.c_str();

Предупреждение: это не будет работать, если std::stringсодержит \0s.

wilhelmtell
источник
3

Я столкнулся с этим вопросом, потому что у меня возникла проблема при ответе на вопросы, поэтому я публикую свое решение здесь.

Все вышеприведенные примеры показывают примеры со строками, содержащими только значения ASCII, и в этом случае все работает нормально. Однако, когда речь идет о строках в Windows, которые также могут содержать другие символы, такие как немецкие умляуты, эти решения не работают

Единственный код, который дает правильные результаты в таких случаях,

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

Если вам не нужно иметь дело с такими строками, то приведенные выше ответы будут работать нормально.

Devolus
источник
Это зависит не от 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());
gavinb
источник
1
Достаточно верно, хотя ОП не упомянул встроенные NULL. Если это требуется, вы можете использовать QByteArray::QByteArray (const char* data, int size)сначала оболочку буфера, а затем передать ее QStringконструктору.
gavinb