Was ist der einfachste Weg, dies zu tun?
Was ist der einfachste Weg, dies zu tun?
Antworten:
Wenn Sie mit Zeichenfolge meinen std::string
, können Sie dies mit dieser Methode tun:
QString QString :: fromStdString (const std :: string & str)
std::string str = "Hello world";
QString qstr = QString::fromStdString(str);
Wenn Sie mit Zeichenfolge Ascii-codiert meinen, const char *
können Sie diese Methode verwenden:
QString QString :: fromAscii (const char * str, int size = -1)
const char* str = "Hello world";
QString qstr = QString::fromAscii(str);
Wenn Sie const char *
mit einer Systemcodierung codiert haben, die mit QTextCodec :: codecForLocale () gelesen werden kann, sollten Sie diese Methode verwenden:
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);
Wenn Sie const char *
UTF8-codiert haben , müssen Sie diese Methode verwenden:
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);
Es gibt auch eine Methode zum const ushort *
Enthalten von UTF16-codierten Zeichenfolgen:
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);
Wenn mit STL-Kompatibilität kompiliert, QString
verfügt eine statische Methode zum Konvertieren von a std::string
in a QString
:
std::string str = "abc";
QString qstr = QString::fromStdString(str);
QString qstr = QString(str.c_str());
? Nicht sicher, ob QString
kopiert wird, was darin übergeben wurde.
fromStdString
wird diese bewahren, aus .c_str
nicht konstruieren . (Und genau das hat mich zu dieser Frage geführt.)
Alternativer Weg:
std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());
Dies hat den Vorteil, dass .c_str()
das Gerät nicht verwendet wird, was dazu führen kann std::string
, dass es sich selbst kopiert, falls '\0'
am Ende kein Platz zum Hinzufügen vorhanden ist .
.c_str()
)
std::string s = "Sambuca";
QString q = s.c_str();
Warnung: Dies funktioniert nicht, wenn das s std::string
enthält \0
.
Ich bin auf diese Frage gestoßen, weil ich beim Befolgen der Antworten ein Problem hatte. Deshalb poste ich meine Lösung hier.
Die obigen Beispiele zeigen alle Beispiele mit Zeichenfolgen, die nur ASCII-Werte enthalten. In diesem Fall funktioniert alles einwandfrei. Wenn Sie jedoch mit Zeichenfolgen in Windows arbeiten, die auch andere Zeichen enthalten können, z. B. deutsche Umlaute, funktionieren diese Lösungen nicht
Der einzige Code, der in solchen Fällen korrekte Ergebnisse liefert, ist
std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());
Wenn Sie sich nicht mit solchen Zeichenfolgen befassen müssen, funktionieren die obigen Antworten einwandfrei.
fromLocal8Bit()
Darüber hinaus können Sie die QVariant-Klasse verwenden, um alles zu konvertieren, was Sie möchten.
beispielsweise:
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();
Ausgabe
"hello !"
"10"
"5.42"
5
Meinen Sie eine C-Zeichenfolge wie in einer char*
Zeichenfolge oder ein C ++ - std::string
Objekt?
In beiden Fällen verwenden Sie denselben Konstruktor, wie in der QT-Referenz dokumentiert:
Verwenden Sie für eine reguläre C-Zeichenfolge einfach den Hauptkonstruktor:
char name[] = "Stack Overflow";
QString qname(name);
Für a std::string
erhalten Sie das char*
an den Puffer und übergeben es an den QString
Konstruktor:
std::string name2("Stack Overflow");
QString qname2(name2.c_str());
QByteArray::QByteArray (const char* data, int size)
den Puffer zuerst umschließen und dann an den QString
Konstruktor übergeben.