Преобразование QString в char * - PullRequest
81 голосов
/ 26 марта 2010

Я пытался преобразовать QString в тип char * следующими методами, но, похоже, они не работают.

//QLineEdit *line=new QLineEdit();{just to describe what is line here}

QString temp=line->text();
char *str=(char *)malloc(10);
QByteArray ba=temp.toLatin1();
strcpy(str,ba.data());

Можете ли вы уточнить возможный недостаток этого метода или дать альтернативный метод?

Ответы [ 8 ]

108 голосов
/ 26 марта 2010

Что ж, Qt FAQ говорит:

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

Так что, возможно, у вас другие проблемы. Как именно это не работает?

42 голосов
/ 02 июня 2010

Может быть

my_qstring.toStdString().c_str();

или безопаснее, как указывает Федерико:

std::string str = my_qstring.toStdString();
const char* p = str.c_str();

Это далеко не оптимально, но сработает.

36 голосов
/ 10 мая 2016

Самый простой способ преобразования QString в char * - это qPrintable (const QString & str) , который является макросом, расширяющимся до str.toLocal8Bit().constData().

6 голосов
/ 04 августа 2010

Ответ Дэвида работает нормально, если вы используете его только для вывода в файл или для отображения на экране, но если для функции или библиотеки требуется синтаксический анализатор *, то этот метод работает лучше всего:

// copy QString to char*
QString filename = "C:\dev\file.xml";
char* cstr;
string fname = filename.toStdString();
cstr = new char [fname.size()+1];
strcpy( cstr, fname.c_str() );

// function that requires a char* parameter
parseXML(cstr);
3 голосов
/ 31 мая 2018

EDITED

этот способ также работает

QString str ("Something");

char* ch = str.toStdString().C_str();
2 голосов
/ 29 мая 2016

Правильное решение было бы так

   QString k;
   k = "CRAZYYYQT";
   char ab[16];
   sprintf(ab,"%s",(const char *)((QByteArray)(k.toLatin1()).data()) );
   sprintf(ab,"%s",(const char *)((QByteArray)(k.toStdString()).data()));  
   sprintf(ab,"%s",(const char *)k.toStdString().c_str()  );
   qDebug()<<"--->"<<ab<<"<---";
2 голосов
/ 26 марта 2010

Ваша строка может содержать не символы Latin1, что приводит к неопределенным данным. Это зависит от того, что вы подразумеваете под «это, кажется, не работает».

0 голосов
/ 11 декабря 2018

Если ваша строка содержит символы не ASCII - лучше сделать это следующим образом: s.toUtf8().data() (или s->toUtf8().data())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...