Как изменить строку в QString? - PullRequest
132 голосов
/ 29 ноября 2009

Какой самый простой способ сделать это?

Ответы [ 7 ]

238 голосов
/ 29 ноября 2009

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

std::string str = "abc";
QString qstr = QString::fromStdString(str);
120 голосов
/ 29 ноября 2009

Если под строкой вы имеете в виду 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);
13 голосов
/ 29 ноября 2009

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

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

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

10 голосов
/ 29 ноября 2009
std::string s = "Sambuca";
QString q = s.c_str();

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

3 голосов
/ 17 сентября 2014

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

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

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

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

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

0 голосов
/ 02 мая 2015

Более того, чтобы конвертировать все, что вы хотите, вы можете использовать класс 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 голосов
/ 29 ноября 2009

Вы имеете в виду строку C, как в строке char*, или объект C ++ std::string?

В любом случае, вы используете тот же конструктор, который задокументирован в справочнике QT:

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

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

Для std::string вы получаете char* в буфер и передаете его конструктору QString:

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