【问题标题】:Converting QString to char* [duplicate]将 QString 转换为 char* [重复]
【发布时间】:2011-07-27 04:30:35
【问题描述】:

可能重复:
QString to char conversion

我有一个函数(在 STL 中为 fopen),它在我的计算机中提供一个 char* 参数作为路径,但我必须在那个地方使用 QString,所以它不起作用。

如何将 QString 转换为 char* 来解决这个问题?

【问题讨论】:

    标签: c++ string qt qt4


    【解决方案1】:

    here at How can I convert a QString to char* and vice versa?

    为了将 QString 转换为 char*,那么你首先需要得到一个 字符串的 latin1 表示 在其上调用 toLatin1() 将 返回一个 QByteArray。然后调用 data() 在 QByteArray 上获取指向的指针 存储在字节数组中的数据。看 文档:

    https://doc.qt.io/qt-5/qstring.html#toLatin1 https://doc.qt.io/qt-5/qbytearray.html#data

    请参阅以下示例 演示:

    int main(int argc, char **argv)
    {
     QApplication app(argc, argv);
      QString str1 = "Test";
      QByteArray ba = str1.toLatin1();
      const char *c_str2 = ba.data();
      printf("str2: %s", c_str2);
      return app.exec();
    }
    

    请注意,必须存储 调用 data() 之前的字节数组 它,像下面这样的调用

    const char *c_str2 = str2.toLatin1().data();
    

    会使应用程序崩溃 QByteArray 尚未存储且 因此不再存在

    要将 char* 转换为 QString,您 可以使用 QString 构造函数 接受一个QLatin1String,例如:

    QString string = QString(QLatin1String(c_str2)) ;
    

    查看文档:

    https://doc.qt.io/qt-5/qlatin1string.html

    当然,我发现previous SO answer还有另一种方法:

    QString qs;
    
    // Either this if you use UTF-8 anywhere
    std::string utf8_text = qs.toUtf8().constData();
    
    // or this if you on Windows :-)
    std::string current_locale_text = qs.toLocal8Bit().constData();
    

    【讨论】:

    • 我认为措辞需要改变。声明 const char *c_str2 = str2.toLatin1().data(); 应该可以正常工作。不幸的是在';'之后toLatin1() 创建的临时 QByteArray 已被销毁,因此 c_str2 现在有一个无效指针。相反,您可以在调用 doStuff(str2.toLatin1().data()); 中使用它,因为 QByteArray 直到 ';' 才会被销毁因此:printf("str2: %s", str2.toLatin1().data()); 应该没问题。
    • @Martin:我只是在引用 Qt。
    • 这个。我今天花了一半时间调试一个由底层 QByteArray 被破坏引起的问题。必须存储字节数组确实很痛苦,但似乎是必要的。
    • Loki 的评论似乎恰到好处。我使用 someFunction(myQString.toUtf8().constData());一直都很好,但是如果您尝试使用 char *myCString = myQString.toUtf8().constData();然后使用 myCString,您最终会得到一个有时有效有时无效的 C 字符串,具体取决于当您通过 C 指针访问其内容时 QByteArray 是否仍然有效。这里绝对需要小心!
    • 我跳的是 char* 而不是 const char *
    【解决方案2】:

    您可以使用 QFile 而不是 std::fstream。

    QFile           file(qString);
    

    或者将 QString 转换为 char*,如下所示:

    std::ifstream   file(qString.toLatin1().data());
    

    QString 采用 UTF-16 格式,因此在此处转换为 Latin1(),但 QString 有几个不同的转换,包括 toUtf8()(检查您的文件系统,它可能使用 UTF-8)。

    正如上面@0A0D 所指出的:不要将 char* 存储在变量中,而不获取 QByteArray 的本地副本。

    char const*      fileName = qString.toLatin1().data();
    std::ifstream    file(fileName);  // fileName not valid here.
    

    这是因为 toLatin1() 返回一个 QByteArray 的对象。由于它实际上并未绑定到变量,因此它是在表达式末尾被销毁的临时变量。因此,此处对 data() 的调用返回一个指向内部结构的指针,该结构在 ';' 之后不再存在。

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 2014-01-16
      • 2020-04-20
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2013-05-11
      • 2014-09-08
      相关资源
      最近更新 更多