在使用 Qt 編寫計時器程序時,我遇到一個很奇怪的問題:使用 QTime::toString("hh:mm:ss.zzz")
格式化時間后,顯示出來的是一串亂碼,如下所示:
本來應該是:
但卻顯示了一堆“〇”或奇怪的符號。
問題表現
在界面上用 QLabel
或 QTextEdit
顯示時間字符串時,代碼如下:
ui->showTime->setText(time.toString("hh:mm:ss.zzz"));
然而運行后,顯示為全角符號或亂碼:〇〇:〇〇:〇〈.〈『〇
原因分析
這是因為 toString("hh:mm:ss.zzz")
返回的字符串雖然是正常的數字格式,但Qt 的控件默認字體設置或語言環境不正確,導致它無法正常顯示 ASCII 數字和標點符號,而退回到了全角字符或替代字符(如“〇”、“〈”、“『”等)來渲染。
特別是中文環境下,某些系統字體(例如仿宋、楷體)默認不支持半角英文數字,會強制顯示全角字符。
解決方案(如果大家有什么好的解決方法可以評論區留言)
不要直接使用 time.toString()
輸出格式化時間,而是使用 QString::arg
手動拼接字符串,確保每一段都是純 ASCII 字符,并設置控件字體為標準字體。
QString text = QString("%1:%2:%3.%4").arg(time.hour(), 2, 10, QChar('0')).arg(time.minute(), 2, 10, QChar('0')).arg(time.second(), 2, 10, QChar('0')).arg(time.msec(), 3, 10, QChar('0'));ui->showTime->setText(text);
這樣拼接出來的時間字符串是:00:01:23.045??絕對不會出現亂碼問題。??
結合打點記錄功能
如果你有一個“標記”按鈕,記錄時間點,可以這樣寫:
static int i = 0;
i++;
QString text = QString("第%1次打點:%2:%3:%4.%5").arg(i).arg(time.hour(), 2, 10, QChar('0')).arg(time.minute(), 2, 10, QChar('0')).arg(time.second(), 2, 10, QChar('0')).arg(time.msec(), 3, 10, QChar('0'));ui->bitTime->append(text);
總結
項目 | 內容 |
---|---|
問題類型 | Qt 顯示亂碼 |
關鍵詞 | QTime::toString 、亂碼、“〇〇” |
解決方式 | 使用 QString::arg 拼接格式化時間字符串 |
推薦字體 | Arial、微軟雅黑(Microsoft YaHei) |