您的位置:首页 > 编程语言 > Qt开发

QT 格式化字符串功能

2016-03-17 19:33 543 查看
直接想到使用 sprintf(),写出如下的代码:

void MainWindow::formatSerInfo(void)
{
QString strTest("Tst");
QString strSerInfo;
strSerInfo.sprintf("%s %d",strTest,m_baudRateCur);
hintSerSts->setText(strSerInfo);
}


编译直接报错,错误信息如下:

C:\Qt\QtPrj\SerialAssist\mainwindow.cpp:427: error: cannot pass objects of non-trivially-copyable type 'class QString' through '...'
strSerInfo.sprintf("%s %d",strTest,m_baudRateCur);
C:\Qt\QtPrj\SerialAssist\mainwindow.cpp:427: warning: format '%s' expects argument of type 'char*', but argument 3 has type 'QString' [-Wformat=]


不支持 QString 的 sprintf, 使用起来最是不方便!

QString 转 char * 还是比较麻烦的:

先将 QString 转换为 QByteArray,再将 QByteArray 转换为 char *。

注意:不能用下面的转换形式 char *mm = str.toLatin1().data(); 。因为这样的话,str.toLatin1() 得到的 QByteArray 类型结果就不能保存,最后转换,mm 的值就为空。

示例:

Qstring str;
char *ch;
QByteArray ba = str.toLatin1();
ch = ba.data();


这样就完成了 QString 向 char * 的转化。经测试程序运行时不会出现 Bug。

注意第三行,一定要加上,不可以 str.toLatin1().data() 这样一部完成,可能会出错。

所以上述代码最后修改为:

void MainWindow::formatSerInfo(void)
{
QString strTest("Tst");
QString strSerInfo;
QByteArray baTmp = strTest.toLatin1();
strSerInfo.sprintf("%s %d",baTmp.data(),m_baudRateCur);
hintSerSts->setText(strSerInfo);
}


或者,使用 arg 方法:

void MainWindow::formatSerInfo(void)
{
QString strTest("Tst");
QString strSerInfo;
strSerInfo = QString("%1 %2").arg(strTest).arg(m_baudRateCur);
hintSerSts->setText(strSerInfo);
}


在 QT 中,建议使用后面方法,即 arg() 的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: