【问题标题】:How to change string into QString?如何将字符串更改为 QString?
【发布时间】:2010-12-21 07:32:52
【问题描述】:

最基本的方法是什么?

【问题讨论】:

    标签: c++ string qt qstring


    【解决方案1】:

    如果你的字符串是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);
    

    【讨论】:

    • Ascii 在 QT5 中已经过时了...
    【解决方案2】:
    std::string s = "Sambuca";
    QString q = s.c_str();
    

    警告:如果std::string 包含\0s,这将不起作用。

    【讨论】:

      【解决方案3】:

      您是指 C 字符串,如 char* 字符串,还是 C++ std::string 对象?

      无论哪种方式,您都使用相同的构造函数,如 QT 参考中所述:

      对于常规的 C 字符串,只需使用主构造函数:

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

      对于std::string,您将char* 获取到缓冲区并将其传递给QString 构造函数:

      std::string name2("Stack Overflow");
      QString qname2(name2.c_str());
      

      【讨论】:

      • 确实如此,尽管 OP 没有提到嵌入的 NULL。如果需要,您可以先使用QByteArray::QByteArray (const char* data, int size) 包装缓冲区,然后将其传递给QString 构造函数。
      【解决方案4】:

      如果与 STL 兼容编译,QString 有一个 static methodstd::string 转换为 QString

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

      【讨论】:

      • 我认为这实际上应该避免。如果编译时使用的标准库 QT 的版本与您正在编译的版本有所不同,那么您将遇到麻烦。 In 在 QT 和 libstdc++ 之间创建了一个不必要的依赖关系,这种依赖关系在 QT 的其他任何地方都不存在。
      • @shoosh:为了避免这种情况,不能只做QString qstr = QString(str.c_str());吗?不确定QString 是否复制了传入的内容。
      • @shoosh:我理解您对兼容性的担忧,但 QString 和 std::string 都可以包含空字符。 fromStdString 将保留这些,从 .c_str 构造不会。 (正是如何做到这一点让我想到了这个问题。)
      • @MartinBonner QByteArray 有一个接受 const char* 和长度的 ctor。 QString 有一个接受 QByteArray 的 ctor
      【解决方案5】:

      另一种方式:

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

      这样做的好处是不使用.c_str(),这可能会导致std::string自我复制,以防最后没有地方添加'\0'

      【讨论】:

      • 使用 c++11,这不再是问题(.c_str() 的隐藏副本)
      • 在 C++11 之前,潜在的隐藏副本纯粹是理论上的可能性——实际上没有实现。
      【解决方案6】:

      我遇到这个问题是因为我在遵循答案时遇到问题,所以我在这里发布我的解决方案。

      以上示例都显示了字符串仅包含 ASCII 值的示例,在这种情况下一切正常。但是,当在 Windows 中处理还可以包含其他字符(例如德语变音符号)的字符串时,这些解决方案不起作用

      在这种情况下给出正确结果的唯一代码是

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

      如果你不必处理这样的字符串,那么上面的答案就可以了。

      【讨论】:

      • 这不依赖于 std::string 而是依赖于源文件与字符串文字的编码。如果您的源文件是 UTF8,它可以工作,但会中断您对 fromLocal8Bit() 的调用
      【解决方案7】:

      此外,要转换任何你想要的,你可以使用 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
      

      【讨论】:

        猜你喜欢
        • 2019-05-19
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        相关资源
        最近更新 更多