add color output use qdebug

本文介绍如何在终端中输出带有颜色的文字及背景,包括使用转义字符进行文字颜色、背景颜色的设置,以及如何通过转义字符实现清除屏幕等功能。文中还提供了具体的例子,如使用qDebug输出绿色文字的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用自:

http://fanzhichao.blog.hexun.com/22330640_d.html

 

在终端输出彩色信息有点类似于html的语法,即在要输出的文字前加上转义字符。

指令格式如下\033[*m

这里的*就是转义字符,例如我们要输出一段绿色的文字

qDebug("\033[32mHello!");

输出结果:Hello!

此外还可以设置字体的背景底色、是否加粗、清楚屏幕等等。。。。

其中*的取值如下

  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 : 删除整个屏幕

 

对于使用echo输出,也可以使用类似方法添加颜色:

echo -e "\033[3;42m test \033[3;49m"

#include "demresultexcel.h" DemResultExcel::DemResultExcel() { sheet = nullptr; range = nullptr; excel = nullptr; workBook = nullptr; } bool DemResultExcel::open(const QString &strFilePathName) { if(strFilePathName == nullptr) return false; excel = new QAxObject(); if(excel->setControl("Excel.Application")) { qDebug()<<"use Excel"; } else { excel->setControl("ket.Application"); } // excel->setControl("ket.Application"); excel->setProperty("Visible",false); excel->setProperty("DisplayAltert",false); QAxObject* workBooks = excel->querySubObject("WorkBooks"); if(workBooks == nullptr) { qDebug()<<"no workBooks"; close(); return false; } if(QFile::exists(strFilePathName)) { qDebug()<<"文件已存在"; workBooks->dynamicCall("open(const Qstring&)",QDir::toNativeSeparators(strFilePathName)); workBook = excel->querySubObject("ActiveWorkBook"); } else { QVariant ret = workBooks->dynamicCall("Add"); if(!ret.isValid()) { qDebug()<<"Null"; close(); return false; } workBook = excel->querySubObject("ActiveWorkBook"); if(workBook) workBook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(strFilePathName)); else { qDebug()<<"文件未存在且未创建"; close(); } } if(workBook == nullptr) return false; return true; } void DemResultExcel::setSheetName(QString name, int index) { QAxObject* sheets = workBook->querySubObject("WorkSheets"); int sheetcount = sheets->dynamicCall("Count").toInt(); while(sheetcount<index) { workBook->querySubObject("Add()"); sheetcount++; } QAxObject* targetSheet = workBook->querySubObject("WorkSheets(int)",index); targetSheet->setProperty("Name",name); } bool DemResultExcel::setSheetIndex(int index) { if(workBook == nullptr) return false; sheet = workBook->querySubObject("WorkSheets(int)",index); if(sheet != nullptr) return true; return false; } bool DemResultExcel::setHeaderData(QStringList header) { if(sheet == nullptr) { qDebug()<<"no sheet"; return false; } qDebug()<<"has sheet"; // QAxObject* headerRange = sheet->querySubObject("Range(const QString&)","A1:D1"); // QList<QList<QVariant>>headerData; // QList<QVariant> head; // for(auto data:header) // { // head.append(data); // } // headerData.append(head); // headerData.append({"电平","Eb/N0","解调误码率","数据误码率"}); // QStringList head = {"电平","Eb/N0","解调误码率","数据误码率"}; // headerRange->setProperty("NumberFormat","@"); // headerRange->setProperty("value",var); for(int i = 1;i<=header.size();i++){ QAxObject* cell = sheet->querySubObject("Cells(int,int)",1,i); cell->setProperty("Value2",header[i-1]); } workBook->dynamicCall("Save()"); return true; } void DemResultExcel::close() { workBook->dynamicCall("Save()"); workBook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); delete excel; } bool DemResultExcel::appendResultItem(const dem_result_item &item) { if(workBook == nullptr) return false; // sheet->dynamicCall("Calculate"); QAxObject* usedRange = sheet->querySubObject("UsedRange"); int row = usedRange->property("Row").toInt()+ usedRange->querySubObject("Rows")->property("Count").toInt(); setCellValue(item.level,row,1); setCellValue(item.EbN0,row,2); setCellValue(item.demErrRate,row,3); setCellValue(item.dataErrRate,row,4); workBook->dynamicCall("Save()"); return true; } void DemResultExcel::setCellValue(QVariant value, int row, int col) { QAxObject* cell = sheet->querySubObject("Cells(int,int)",row,col); cell->setProperty("Value2",value); } 那为什么这段代码会显示QAxBase::dynamicCallHelper: Add(): No such property
最新发布
06-17
04-02
<think>好的,我现在需要处理用户关于QDebug的问题。用户想了解QDebug的用法或解决相关问题。首先,我需要回忆QDebug在Qt中的基本用途,它是用于调试信息输出的类,通常和qDebug()一起使用。接下来,我得组织回答的结构,确保符合用户的要求:使用中文,行内公式用$...$,独立公式用$$...$$,生成相关问题,并在引用处添加标识。 首先,介绍QDebug的基本用法,比如如何输出变量值、对象信息。需要示例代码,这有助于用户理解。然后,提到格式化输出,比如使用%s、%d等,以及输出Qt对象时的处理,例如QString可能需要toUtf8()转换,但记得Qt5以后可能不需要了,需要确认这一点是否正确。 接下来是高级用法部分,包括重载operator<<来自定义对象的输出,控制输出格式如空格和换行,以及使用qSetMessagePattern设置日志格式。这里要给出代码示例,比如如何重载操作符,如何使用noquote(),如何设置消息模式。 然后是常见问题及解决方法。比如调试信息不显示,需要检查是否定义了QT_NO_DEBUG_OUTPUT,或者是否安装了消息处理器。还有日志格式控制的问题,比如使用qSetMessagePattern的正确方式。多线程安全方面,要提到qDebug是否线程安全,以及可能需要QMutex来保证输出完整性。 在生成相关问题的时候,需要围绕QDebug的常见疑问展开,比如禁用调试信息、重载operator<<、多线程安全、输出到文件、与std::cout的区别,以及处理浮点数精度。 需要注意引用标识的添加,比如在提到检查QT_NO_DEBUG_OUTPUT时添加[^1],或者在说明qInstallMessageHandler时引用[^2]。要确保每个引用都有对应的来源,但用户提供的引用源似乎没有具体内容,可能需要假设存在这些引用或者适当处理。 同时,要检查LaTeX格式是否正确,比如行内公式是否正确使用$符号,是否有独立的公式块。不过QDebug的内容可能较少涉及数学公式,但如果有相关的表达式,比如输出格式中的占位符,可能需要用$...$包裹。 最后,确保回答结构清晰,分点明确,代码示例正确,并且相关问题覆盖用户可能感兴趣的方向。需要避免错误的信息,例如关于Qt5是否需要转换QString为const char*,实际上qDebug()直接支持QString输出,所以之前的说法可能需要修正,应该指出在Qt5中可以直接使用,不需要转换。 总结步骤:介绍基本用法,给出代码示例;高级用法包括自定义输出和格式控制;常见问题及解决方法;生成相关问题;检查引用和格式是否正确。</think>### QDebug 使用指南 QDebug 是 Qt 框架中用于输出调试信息的工具类,常用于日志记录和变量追踪。以下是其核心用法及常见问题解决方案: --- #### 一、基础用法 1. **输出变量值** 使用 `qDebug()` 直接输出变量或字符串: ```cpp int value = 42; qDebug() << "当前值:" << value; // 输出:当前值:42 ``` 2. **格式化输出** 类似 `printf` 的格式化语法: ```cpp QString name = "Alice"; qDebug("Name: %s, Age: %d", name.toUtf8().constData(), 30); // 输出:Name: Alice, Age: 30 ``` 3. **输出 Qt 对象** 直接支持 Qt 容器和对象(如 `QString`、`QList`): ```cpp QList<int> list = {1, 2, 3}; qDebug() << "列表内容:" << list; // 输出:列表内容:QList(1, 2, 3) ``` --- #### 二、高级用法 1. **自定义对象输出** 重载 `operator<<` 以支持自定义类型: ```cpp struct Point { int x, y; }; QDebug operator<<(QDebug debug, const Point& p) { debug.nospace() << "(" << p.x << ", " << p.y << ")"; return debug; } // 使用 Point p{10, 20}; qDebug() << "坐标:" << p; // 输出:坐标: (10, 20) ``` 2. **控制输出格式** - 禁用自动空格:`qDebug().nospace() << "No" << "Space";` → 输出:`NoSpace` - 强制换行:`qDebug().noquote() << "Line1\nLine2";` 3. **日志级别控制** 通过 `qSetMessagePattern` 定制日志格式[^1]: ```cpp qSetMessagePattern("[%{time yyyy-MM-dd hh:mm:ss}] %{type}: %{message}"); qDebug() << "测试消息"; // 输出:[2023-10-01 12:34:56] debug: 测试消息 ``` --- #### 三、常见问题及解决 1. **调试信息不显示** - 检查是否定义了宏 `QT_NO_DEBUG_OUTPUT`,该宏会禁用所有 `qDebug` 输出[^2]。 - 确认未调用 `qInstallMessageHandler` 重定向或过滤日志[^3]。 2. **多线程安全** `qDebug` 非线程安全,多线程中需加锁: ```cpp QMutex mutex; void threadSafeDebug(const QString& msg) { QMutexLocker locker(&mutex); qDebug() << msg; } ``` 3. **浮点数精度问题** 使用 `qSetRealNumberPrecision` 设置浮点输出精度: ```cpp qDebug() << "默认精度:" << 3.1415926535; // 输出:3.14159 qSetRealNumberPrecision(10); qDebug() << "高精度:" << 3.1415926535; // 输出:3.1415926535 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值