Jak zamienić string na QString?

153

Jaki jest najbardziej podstawowy sposób, aby to zrobić?

Nigdy więcej
źródło

Odpowiedzi:

154

Jeśli przez string masz na myśli, std::stringże możesz to zrobić tą metodą:

QString QString :: fromStdString (const std :: string & str)

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

Jeśli przez string masz na myśli kodowanie Ascii const char *, możesz użyć tej metody:

QString QString :: fromAscii (const char * str, int size = -1)

const char* str = "Hello world";
QString qstr = QString::fromAscii(str);

Jeśli const char *zakodowałeś za pomocą kodowania systemowego, które można odczytać za pomocą QTextCodec :: codecForLocale () , powinieneś użyć tej metody:

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);

Jeśli masz const char *to zakodowane w UTF8, musisz użyć tej metody:

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);

Istnieje również metoda const ushort *zawierająca zakodowany ciąg znaków 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);
Kamil Szot
źródło
1
Nie chciałbyś konstruować QString z `new '.
rohanpm
@Rohan - Dziękuję za komentarz. Usuwam to z mojej odpowiedzi.
Kamil Szot
Nie odpowiada na pytanie.
CCoder,
1
Nigdy nie widziałem akceptowanej odpowiedzi z tyloma negatywnymi opiniami. Dlaczego autor nie redaguje go w coś lepszego niż najwyżej oddana odpowiedź? Chcesz dodać więcej szczegółów? Do tego czasu ciesz się jeszcze jednym -1.
Tomáš Zato - Przywróć Monikę
3
Wygląda na to, że jest teraz naprawiony i jest całkiem niezły, więc dałem +1 i temu drugiemu.
csl
242

Jeśli jest skompilowany z kompatybilnością STL, QStringma statyczną metodę konwersji a std::stringna QString:

std::string str = "abc";
QString qstr = QString::fromStdString(str);
sth
źródło
3
Moim zdaniem należy tego właściwie unikać. Jeśli wersja standardowej biblioteki QT, z którą została skompilowana, różni się w jakiś sposób od tej, z którą kompilujesz, będziesz miał kłopoty. In tworzy niepotrzebną zależność między QT i libstdc ++, której nie ma nigdzie indziej w QT.
shoosh
@shoosh: Aby tego uniknąć, nie można po prostu zrobić QString qstr = QString(str.c_str());? Nie jestem pewien, czy QStringkopiuje to, co do niego zostało przekazane.
Claudiu
@shoosh: Rozumiem twoje obawy dotyczące kompatybilności, ale zarówno QString, jak i std :: string mogą zawierać znaki null. fromStdStringzachowa je, konstruując z .c_strwill. (I właśnie to, jak to zrobić, doprowadziło mnie do tego pytania.)
Martin Bonner wspiera Monikę
@MartinBonner QByteArray ma ctor, który przyjmuje const char * i długość. QString ma konstruktor, że trwa QByteArray
shoosh
13

Alternatywny sposób:

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

Ma to tę zaletę, że nie używa się, .c_str()co może spowodować std::stringskopiowanie się w przypadku, gdy nie ma miejsca na dodanie '\0'na końcu.

shoosh
źródło
2
Dzięki za wskazówkę dotyczącą potencjalnej ukrytej kopii za pomocą .c_str ().
Trass3r
W przypadku c ++ 11 nie stanowi to już problemu (ukryta kopia z .c_str())
Steve Lorimer
1
Przed C ++ 11 potencjalna ukryta kopia była czysto teoretyczną możliwością - żadna implementacja tak naprawdę tego nie zrobiła.
Martin Bonner wspiera Monikę
11
std::string s = "Sambuca";
QString q = s.c_str();

Ostrzeżenie: to nie zadziała, jeśli std::stringzawiera pliki \0s.

wilhelmtell
źródło
3

Trafiłem na to pytanie, ponieważ miałem problem z podążaniem za odpowiedziami, więc zamieszczam tutaj swoje rozwiązanie.

Wszystkie powyższe przykłady pokazują próbki z ciągami zawierającymi tylko wartości ASCII, w takim przypadku wszystko działa dobrze. Jednak w przypadku ciągów znaków w systemie Windows, które mogą zawierać również inne znaki, takie jak niemieckie umlauty, to te rozwiązania nie działają

Jedynym kodem, który daje poprawne wyniki w takich przypadkach jest

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

Jeśli nie masz do czynienia z takimi ciągami znaków, powyższe odpowiedzi będą działać poprawnie.

Devolus
źródło
Zależy to nie od std :: string, ale od kodowania pliku źródłowego za pomocą literału ciągu. Jeśli twój plik źródłowy to UTF8, będzie działać, ale przerwie połączeniefromLocal8Bit()
namezero
0

Ponadto, aby przekonwertować cokolwiek chcesz, możesz użyć klasy QVariant.

na przykład:

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();

wynik

"hello !"
"10"
"5.42"
5
Gabriel de Grimouard
źródło
0

Czy masz na myśli ciąg w C, jak w char*ciągu, czy obiekt C ++ std::string?

Tak czy inaczej, używasz tego samego konstruktora, który jest udokumentowany w dokumentacji QT:

Aby uzyskać zwykły ciąg w C, użyj głównego konstruktora:

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

W przypadku a std::string, uzyskujesz char*do bufora i przekazujesz go do QStringkonstruktora:

std::string name2("Stack Overflow");
QString qname2(name2.c_str());
gavinb
źródło
1
To prawda, chociaż OP nie wspomniał o osadzonych wartościach NULL. Jeśli jest to wymagane, możesz QByteArray::QByteArray (const char* data, int size)najpierw otoczyć bufor, a następnie przekazać go do QStringkonstruktora.
gavinb