Який найосновніший спосіб це зробити?
Який найосновніший спосіб це зробити?
Відповіді:
Якщо під рядком ви маєте на увазі, 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);
Якщо компільовано зі сумісністю STL, QString
є статичний метод перетворення a std::string
в QString
:
std::string str = "abc";
QString qstr = QString::fromStdString(str);
QString qstr = QString(str.c_str());
? Не впевнений, чи QString
копіює те, що передано в нього.
fromStdString
збережемо їх, будуючи з .c_str
не буде. (І саме як це зробити, мене спонукало до цього питання.)
Альтернативний спосіб:
std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());
Це має перевагу в тому, що не використовувати те, .c_str()
що може призвести std::string
до самої копії у випадку, якщо '\0'
в кінці немає місця додати .
.c_str()
)
std::string s = "Sambuca";
QString q = s.c_str();
Попередження: Це не працюватиме, якщо std::string
містить \0
s.
Я натрапив на це питання, оскільки у мене виникли проблеми, коли слідкували за відповідями, тому я розміщую тут своє рішення.
Наведені вище приклади показують зразки з рядками, що містять лише значення ASCII, і в цьому випадку все працює добре. Однак, якщо мати справу з рядками в Windows, які також можуть містити інші символи, наприклад, німецькі umlauts, ці рішення не працюють
Єдиний код, який дає правильні результати в таких випадках - це
std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());
Якщо вам не доведеться мати справу з такими рядками, то наведені вище відповіді спрацюють чудово.
fromLocal8Bit()
Більше того, для перетворення всього, що ви хочете, ви можете використовувати клас 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);
Для a std::string
, ви отримуєте char*
буфер і передаєте його QString
конструктору:
std::string name2("Stack Overflow");
QString qname2(name2.c_str());
QByteArray::QByteArray (const char* data, int size)
спочатку обернути буфер, а потім передати його QString
конструктору.