Как изменить строку на QString?
Вопрос
Каков самый простой способ сделать это?
Решение
Если под строкой вы имеете в виду std :: string
, вы можете сделать это следующим способом:
QString QString :: fromStdString (const std :: string & amp; str) а> р>
Если под строкой вы имеете в виду кодированный Ascii QString QString :: fromAscii (const char * str, int size = -1 ) р>
Если у вас есть QString QString :: fromLocal8Bit (const char * str, int size = -1 ) р>
Если у вас есть QString QString :: fromUtf8 (const char * str, int size = -1 ) р>
Существует также метод для QString QString :: fromUtf16 (const ushort * unicode, int size = -1 ) р>
<Ч>
std::string str = "Hello world";
QString qstr = QString::fromStdString(str);
const char *
, то вы можете использовать этот метод:
<Ч>
const char* str = "Hello world";
QString qstr = QString::fromAscii(str);
const char *
, закодированный системной кодировкой, которую можно прочитать с помощью QTextCodec :: codecForLocale () , тогда вам следует использовать этот метод:
<Ч>
const char* str = "zażółć gęślą jaźń"; // latin2 source file and system encoding
QString qstr = QString::fromLocal8Bit(str);
const char *
в кодировке UTF8, вам нужно использовать этот метод:
<Ч>
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: 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, и в этом случае все работает нормально. Однако, когда речь идет о строках в Windows, которые также могут содержать другие символы, такие как немецкие умляуты, эти решения не работают
Единственный код, который дает правильные результаты в таких случаях, это
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 просто используйте главный конструктор:
char name[] = "Stack Overflow";
QString qname(name);
Для std::string
, вы получаете char*
в буфер и передать его в QString
конструктор:
std::string name2("Stack Overflow");
QString qname2(name2.c_str());