Qt輸出彩色log信息

簡介

我們在Qt Creator中開發程序的時候,經常要做的一件事情,就是看程序的輸出Log。
一般的log信息都是黑白的,比如這樣的:
fa4bb028a52e28887c9ec2a3c8b192dc.png

濤哥在這裏告訴大家一個隱藏的技能,那就是輸出彩色的log:

293105e6f37901923d3576fcd12c650f.png

從此看到的log,不再是黑白的,而是五顏六色的,生活更加絢麗多彩。

原理

要輸出彩色信息有點類似於html的語法,即在要輸出的文字前加上轉義字符。
指令格式如下\033[m
這裏的
就是轉義字符,例如我們要輸出一段綠色的文字,則
qDebug() << “\033[32m” <<“Hello!”;
即在輸出文字前,先輸出一個顏色指令。
注意這個指令對後續的輸出都會生效,如果想關掉顏色只要再輸出0號指令即可
qDebug() << “\033[0m”;

這裏有一個指令表

  0 : Reset Color Attributes
  1 : 加粗
  2 : 去粗
  4 : 下劃線
  5 : 閃爍
  7 : 反色
  21/22 : 加粗 正常
  24 : 去掉下劃線
  25 : 停止閃爍
  27 : 反色
  30 : 前景,黑色
  31 : 前景,紅色
  32 : 前景,綠色
  33 : 前景,黃色
  34 : 前景,籃色
  35 : 前景,紫色
  36 : 前景,青色
  37 : 前景,白色
  40 : 背景,黑色
  41 : 背景,紅色
  42 : 背景,綠色
  43 : 背景,黃色
  44 : 背景,籃色
  45 : 背景,紫色
  46 : 背景,青色
  47 : 背景,白色
其它轉義字符命令
    清除屏幕 : /033c
  設定水平標位置 : /033[XG
  X爲水平標位置。
  設定垂直標位置 : /033[Xd
  Y爲垂直標位置。
    /033[0K : 刪除從標到該行結尾
  /033[1K : 刪除從該行開始到標處
  /033[2K : 刪除整行 
  /033[0J : 刪除標到螢幕結尾
  /033[1J : 刪除從螢幕開始到標處
  /033[2J : 刪除整個屏幕

濤哥在QtCreator中測試了,只有顏色和加粗指令能生效。

代碼

(代碼使用C++11標準)

爲了方便、直觀地使用,濤哥定義了一套枚舉

enum class LogType {
    Reset = 0,

    Bold,
    Unbold,

    FrontBlack,
    FrontRed,
    FrontGreen,
    FrontYellow,
    FrontBlue,
    FrontPurple,
    FrontCyan,
    FrontWhite,
    BackBlack,
    BackRed,
    BackGreen,
    BackYellow,
    BackBlue,
    BackPurple,
    BackCyan,
    BackWhite,

    TypeCount
};

之後又寫了一個指令列表,順序和前面的枚舉一一對應

static const char * logCommands[] = {
    "\033[0m",
    "\033[1m",
    "\033[2m",
    "\033[30m",
    "\033[31m",
    "\033[32m",
    "\033[33m",
    "\033[34m",
    "\033[35m",
    "\033[36m",
    "\033[37m",
    "\033[40m",
    "\033[41m",
    "\033[42m",
    "\033[43m",
    "\033[44m",
    "\033[45m",
    "\033[46m",
    "\033[47m",
};

這樣就可以通過查表的方式,拿到對應的顏色指令了

    logCommands[(int)(LogType::FrontYellow)]

這個代碼使用了c的強制轉換,在c++11標準中會報警告,建議用static_cast。
所以濤哥又寫了一個轉換函數,將枚舉通過static_cast轉換成int類型。

template <typename EnumType, typename IntType = int>
int enumToInt(EnumType enumValue)
{
    static_assert (std::is_enum<EnumType>::value, "EnumType must be enum");

    return static_cast<IntType>(enumValue);
}

最後就是代碼的全貌了

#include <QDebug>
enum class LogType {
    Reset = 0,

    Bold,
    Unbold,

    FrontBlack,
    FrontRed,
    FrontGreen,
    FrontYellow,
    FrontBlue,
    FrontPurple,
    FrontCyan,
    FrontWhite,
    BackBlack,
    BackRed,
    BackGreen,
    BackYellow,
    BackBlue,
    BackPurple,
    BackCyan,
    BackWhite,

    TypeCount
};
static const char * logCommands[] = {
    "\033[0m",
    "\033[1m",
    "\033[2m",
    "\033[30m",
    "\033[31m",
    "\033[32m",
    "\033[33m",
    "\033[34m",
    "\033[35m",
    "\033[36m",
    "\033[37m",
    "\033[40m",
    "\033[41m",
    "\033[42m",
    "\033[43m",
    "\033[44m",
    "\033[45m",
    "\033[46m",
    "\033[47m",
};
template <typename EnumType, typename IntType = int>
int enumToInt(EnumType enumValue)
{
    static_assert (std::is_enum<EnumType>::value, "EnumType must be enum");

    return static_cast<IntType>(enumValue);
}
int main(int argc, char *argv[])
{
    for (int i = enumToInt(LogType::Bold); i < enumToInt(LogType::TypeCount); ++i)
    {
        qInfo().nospace() << logCommands[i] << i << " Hello World" << logCommands[0];
    }
    qWarning() << logCommands[enumToInt(LogType::FrontBlue)]
               << logCommands[enumToInt(LogType::BackRed)]
               << u8"感謝大家對濤哥系列文章的支持,也"
                  "歡迎直接聯繫我尋求獲得幫助" << logCommands[0];
    return 0;
}

順便說一下,設置了console的工程不能顯示出彩色,得把console去掉。
a03d569415d1c9ab1aaa6fb1a1d62d3a.png

轉載聲明

文章出自濤哥的博客 – 點擊這裏查看濤哥的博客
本作品採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可, 轉載請註明出處, 謝謝合作 © 濤哥

聯繫方式


作者 濤哥
開發理念 弘揚魯班文化,傳承工匠精神
博客 https://wentaojia2014.github.io
知乎 https://www.zhihu.com/people/wentao-jia
郵箱 [email protected]
微信 xsd2410421
QQ 759378563

請放心聯繫我,樂於提供諮詢服務,也可洽談有償技術支持相關事宜。

打賞


覺得分享的內容還不錯, 就請作者喝杯奶茶吧~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章