Qstring chage char*

本文介绍在Qt环境下如何实现QString与C风格字符串之间的相互转换,并详细解释了不同编码方式下转换的具体步骤,包括使用GBK和UTF-8编码进行转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qstring chage char* 
 fp = fopen("C:\\Users\\Public\\system.ini","w");  /*文本方式写入*/
     const char* cname;
   QString str= ui->lineEdit_2->text();
 // cname = ui->lineEdit_2->text().toLatin1().data();
   QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
   QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
//     QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
//     QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
   cname = str.toLocal8Bit().data();//字符串转化
 // cname = QUOTE::fromUtf8(str.toLocal8Bit().data()).toLatin1().data();

  //cname=ui->lineEdit_2->text().toLocal8Bit();
    // CString str( name.c_str() );

    // cname = (LPSTR)(LPCTSTR)st;

    //  strcpy (cname, name.c_str());//string 转c字符串


//       fprintf(stream,"%s%ld%f%c","hello world",
//       65000,3.14159,'x');

//       printf("%s",cname
//      );

     fprintf(fp,"%s",cname
    );
     fclose(fp);

 QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); //保证写出的文字显示不乱码 编码格式的转化

//     fp1 = fopen("C:\\Users\\Public\\widows.ini","r");  /*文本方式写入*/




情形2:Qsting chage char* 最好用  前提是main函数用的是GBK库
  char* ch;
  //  QByteArray ba = contact.toLatin1();
   // QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
 //   QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
    ch = contact.toLocal8Bit().data();//字符串转化
      trayIcon->showMessage(tr(ch),tr(""),QSystemTrayIcon::Information,2000);
  QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); //保证写出的文字显示不乱码 编码格式的转化   因为main函数中默认用 GBK转汉字所以此时应该改回为GBK
 举例2:
QString  qstr=ui->textEdit->toPlainText();
     char* ch;
       //  QByteArray ba = contact.toLatin1();
        // QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
      //   QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
         QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
         QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
         ch = qstr.toLocal8Bit().data();//字符串转化
        FILE *  fp1=fopen("./name.dat","a");
        fprintf(fp1,"%s\n",ch);
        fclose(fp1);  //这儿获取的数字最准确  获取时间列表的时间  自己加    应该写在保存之后的内容里
  QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
  //QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); //保证写出的文字显示不乱码 编码格式的转化

char* chage Qstring
情形1:
 fp = fopen("C:\\Users\\Public\\system.ini","r");  /*文本方式写入  以前也是r */
//     fp = fopen("C:\\Users\\Public\\system.ini","a+");  /*文本方式写入  以前也是r */
       fp1 = fopen("C:\\Users\\Public\\widows.ini","r");  /*文本方式写入*/
       char name[50]={}; //有初始化的必要 不然开始会乱码
     fscanf(fp, "%s",name);
     // ui->lineEdit_2->setText( QString(QLatin1String(name))); //char 转
    //  ui->lineEdit_2->setText( QString(name)); //char 转
     //旁边的名字栏显示的汉字
 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); //保证写出的文字显示不乱码 编码格式的转化
 //用GBK编的码就用gbk来解码白框里显示名字
ui->lineEdit_2->setText( QString(tr(name))); //char 转
//QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
//QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
//cname = str.toLocal8Bit().data();
//      QTextCodec *textcod = QTextCodec::codecForName("GBK");
//      QString string1 = textcod ->fromUnicode(listbox1->currentText());
//      strcpy(name,string1);
//      ui->lineEdit_2->setText( string1);
     fscanf(fp1,"%d",&mit);
//     ui->lineEdit_3->text().QString::number(mit);  //得到
      ui->lineEdit_3->setText(QString::number(mit) );
      fclose(fp);
      fclose(fp1);
       QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); //弹出的对话框中显示的文字


情形2:
   QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); //保证写出的文字显示不乱码 编码格式的转化
           //用GBK编的码就用gbk来解码白框里显示名字
        QString  t2= QString(tr(itime1[i])); //char 转itime1[i] 为char类型
                 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); //弹出的对话框中显示的文字


注意:
 trayIcon->showMessage(tr("我爱你"),tr(""),QSystemTrayIcon::Information,2000);  //所以 tr里面的是char* 字符串
http://www.cnblogs.com/Romi/archive/2012/03/12/2392478.html
http://www.cnblogs.com/findumars/p/4851236.html
<think>嗯,用户想将QString转换为char*。我需要回忆一下Qt中处理字符串转换的方法。首先,QString是Unicode字符串,而char*通常是ANSI或UTF-8编码的字节数组。转换时需要注意编码问题。 记得QString有toLatin1()和toUtf8()方法,它们返回QByteArray。比如,用toUtf8()转换成UTF-8编码的字节数组,然后通过data()获取char*指针。不过要注意,这个指针的生命周期,因为QByteArray是临时对象,可能会被销毁。所以需要使用const char*或者复制数据。 用户可能需要可修改的char*,这时候可能需要使用strdup()或者memcpy来复制内容。另外,如果环境中有中文,应该优先使用UTF-8编码,避免乱码问题。比如,在转换前设置正确的编解码器,但可能在Qt5之后默认使用UTF-8,不需要额外设置。 还要考虑转换后的内存管理,用户需要记得释放分配的内存,避免泄漏。比如,使用strdup()的话,后面要用free()释放。如果用new来分配,就要用delete[]。 可能用户遇到的常见问题包括编码不正确导致乱码,或者指针失效导致崩溃。所以示例代码中需要包含正确的编码转换步骤,并提醒生命周期的问题。 查看之前的引用,引用[1]提到了使用QTextCodec处理中文乱码,但Qt5之后可能不需要了。引用[3]展示了QString的使用,但没有直接转换的例子。所以主要依赖Qt文档中的标准方法。 总结步骤:1. 转换为QByteArray(如toUtf8),2. 获取const char*,3. 如需可修改,复制数据。同时提醒编码和内存管理的问题。</think>在Qt中将$QString$转换为$char*$需要经过编码转换和内存管理操作。以下是两种常用方法及注意事项: ### 方法一:使用UTF-8编码转换 ```cpp QString str = "你好"; QByteArray utf8Data = str.toUtf8(); // 转换为UTF-8字节数组 const char* cstr = utf8Data.constData(); // 获取只读指针 // 如需可修改的char*需复制内存 char* mutableChar = new char[utf8Data.size() + 1]; memcpy(mutableChar, cstr, utf8Data.size() + 1); // 使用后需要释放内存 delete[] mutableChar; ``` ### 方法二:使用Latin1编码转换(仅限ASCII字符) ```cpp QString str = "hello"; QByteArray latin1Data = str.toLatin1(); const char* cstr = latin1Data.constData(); ``` ### 关键注意事项 1. **编码选择**:中文建议使用UTF-8编码,避免使用Latin1导致乱码[^1] 2. **指针有效性**:`constData()`获取的指针仅在$QByteArray$对象存在时有效 3. **内存管理**:使用`new`或`strdup()`分配内存后必须手动释放 4. **跨平台兼容**:Windows默认使用UTF-16编码,Linux/macOS推荐UTF-8 ### 完整示例代码 ```cpp #include <QString> #include <QDebug> #include <cstring> int main() { QString qstr = "Qt字符串转换"; // 转换为UTF-8编码的char* QByteArray utf8Array = qstr.toUtf8(); char* utf8Char = strdup(utf8Array.constData()); qDebug() << "UTF-8:" << utf8Char; free(utf8Char); // 必须释放内存 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值