直接想到使用 sprintf(),寫出如下的代碼:
1 void MainWindow::formatSerInfo(void) 2 { 3 QString strTest("Tst"); 4 QString strSerInfo; 5 strSerInfo.sprintf("%s %d",strTest,m_baudRateCur); 6 hintSerSts->setText(strSerInfo); 7 }
編譯直接報錯,錯誤信息如下:
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 的值就為空。
示例:
1 Qstring str; 2 char *ch; 3 QByteArray ba = str.toLatin1(); 4 ch = ba.data();
這樣就完成了 QString 向 char * 的轉化。經測試程序運行時不會出現 Bug。
注意第三行,一定要加上,不可以 str.toLatin1().data() 這樣一部完成,可能會出錯。
所以上述代碼最后修改為:
1 void MainWindow::formatSerInfo(void) 2 { 3 QString strTest("Tst"); 4 QString strSerInfo; 5 QByteArray baTmp = strTest.toLatin1(); 6 strSerInfo.sprintf("%s %d",baTmp.data(),m_baudRateCur); 7 hintSerSts->setText(strSerInfo); 8 }
或者,使用 arg 方法:
1 void MainWindow::formatSerInfo(void) 2 { 3 QString strTest("Tst"); 4 QString strSerInfo; 5 strSerInfo = QString("%1 %2").arg(strTest).arg(m_baudRateCur); 6 hintSerSts->setText(strSerInfo); 7 }
在 QT 中,建議使用后面方法,即 arg() 的方法。