How to change string into QString?

269,575

Solution 1

If by string you mean std::string you can do it with this method:

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

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

If by string you mean Ascii encoded const char * then you can use this method:

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

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

If you have const char * encoded with system encoding that can be read with QTextCodec::codecForLocale() then you should use this method:

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

If you have const char * that's UTF8 encoded then you'll need to use this method:

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

There's also method for const ushort * containing UTF16 encoded string:

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

Solution 2

If compiled with STL compatibility, QString has a static method to convert a std::string to a QString:

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

Solution 3

Alternative way:

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

This has the advantage of not using .c_str() which might cause the std::string to copy itself in case there is no place to add the '\0' at the end.

Solution 4

std::string s = "Sambuca";
QString q = s.c_str();

Warning: This won't work if the std::string contains \0s.

Solution 5

I came across this question because I had a problem when following the answers, so I post my solution here.

The above examples all show samples with strings containing only ASCII values, in which case everything works fine. However, when dealing with strings in Windows whcih can also contain other characters, like german umlauts, then these solutions don't work

The only code that gives correct results in such cases is

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

If you don't have to deal with such strings, then the above answers will work fine.

Share:
269,575

Related videos on Youtube

NeverAgain
Author by

NeverAgain

Updated on January 28, 2020

Comments

  • NeverAgain
    NeverAgain over 4 years

    What is the most basic way to do it?

  • gavinb
    gavinb almost 13 years
    True enough, although the OP didn't mention embedded NULLs. If that is required, you can use QByteArray::QByteArray (const char* data, int size) to wrapper the buffer first, and then pass that to the QString constructor.
  • shoosh
    shoosh over 10 years
    This should actually be avoided in my opinion. If the version of the standard library QT was compiled with is somehow different from what you're compiling with, you're going to have trouble. In creates an unnecessary dependency between QT and libstdc++ that exists nowhere else in QT.
  • Claudiu
    Claudiu about 10 years
    @shoosh: To avoid that couldn't one just do QString qstr = QString(str.c_str());? Not sure whether QString copies what's passed into it.
  • Steve Lorimer
    Steve Lorimer over 8 years
    With c++11, this is no longer a concern (hidden copy with .c_str())
  • Martin Bonner supports Monica
    Martin Bonner supports Monica over 6 years
    @shoosh: I understand your concerns about compatability, but both QString and std::string can contain null characters. fromStdString will preserve these, constructing from .c_str won't. (And it was precisely how to do this that led me to this question.)
  • shoosh
    shoosh over 6 years
    @MartinBonner QByteArray has a ctor that takes const char* and length. QString has a ctor that takes QByteArray
  • Martin Bonner supports Monica
    Martin Bonner supports Monica over 6 years
    Prior to C++11, the potential hidden copy was a purely theoretical possibility - no implementations actually did that.
  • namezero
    namezero over 4 years
    This is dependent not on std::string but the encoding of your source file with the string literal. If your source file is UTF8, it will work but break your call to fromLocal8Bit()
  • Owl
    Owl about 3 years
    As a quick point fromAscii is now obsolete in QT5...