Jaki jest najbardziej podstawowy sposób, aby to zrobić?
Jaki jest najbardziej podstawowy sposób, aby to zrobić?
Odpowiedzi:
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);
Jeśli jest skompilowany z kompatybilnością STL, QString
ma statyczną metodę konwersji a std::string
na QString
:
std::string str = "abc";
QString qstr = QString::fromStdString(str);
QString qstr = QString(str.c_str());
? Nie jestem pewien, czy QString
kopiuje to, co do niego zostało przekazane.
fromStdString
zachowa je, konstruując z .c_str
will. (I właśnie to, jak to zrobić, doprowadziło mnie do tego pytania.)
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::string
skopiowanie się w przypadku, gdy nie ma miejsca na dodanie '\0'
na końcu.
.c_str()
)
std::string s = "Sambuca";
QString q = s.c_str();
Ostrzeżenie: to nie zadziała, jeśli std::string
zawiera pliki \0
s.
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.
fromLocal8Bit()
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
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 QString
konstruktora:
std::string name2("Stack Overflow");
QString qname2(name2.c_str());
QByteArray::QByteArray (const char* data, int size)
najpierw otoczyć bufor, a następnie przekazać go do QString
konstruktora.