首页 > 编程知识 正文

qdebug如何不换行输出,qdebug输出换行怎么解决

时间:2023-05-05 13:00:18 阅读:164743 作者:3403

文章目录1 .使用方法流方法输出占位符输出2.qdebug输出支持定制结构3 .重定向q debug输出4.qdebug输出格式指定输出支持的格式5 .与pro文件相关

1 .使用方法流程方式输出

不需要在末尾添加endl,如std:out。 使用方便,也支持一般类型的直接输出。 它还支持Qt中的内置数据类型输出,如QMap、QList和QVaraint。 Qt调试工具

QString strText='hello '; bool bOk=true; qDebug () strText bOk; 占位符输出的使用方式与printf完全相同。 因为内部实现是printf

qdebug('%s ',' hello ' ); Qt5源代码

# defineq _ attribute _ format _ printf (a,b ) __attribute_ () format(printf,) a ), ) b ) ) ) )支持voiddeer qDebug定制输出的结构在项目中定制结构非常常见,但打印定制结构很麻烦,每次使用时需要按成员顺序打印普通实现

struct StInfo{ int id; QString dev_id; (;普通用法

StInfo stInfo; qdebug(Stinfo.idStinfo.dev_id; 另一种简单的方法是调用toString (如果需要实现方法并输出结构,则为toString )。

升级实现

struct StInfo{ int id; QString dev_id; qtringtostring((returnqstring ) (stinfo ) %1%2) ) ) ) ) arg ) id ); };升级用法

StInfo stInfo; qdebug(Stinfo.tostring ); 但是,可以通过用元函数重载qDebug来支持自定义类型的输出。 也可以在结构的前后或中间自由标记。 例如,可以更清楚地看到结构前缀、成员变量标记和这是哪个结构的信息。

终极实现

struct StInfo{ int id; QString dev_id; friendinlineqdebugoperator (qdebugout,const stinfo ) out'stinfo ) (info.idinfo.dev_id ' ); 返回输出; }; 终极使用方法

StInfo info; qDebug ) )信息; 3 .重定向qdebug输出qdebug的正舒适度。 在这种情况下,必须将调试信息输出到文件。 全局回调函数voidoutputmsg(Qtmsgtypetype,const qmessagelogcontext context constqstringmsg (.//打开文件并组织字符串写入. ) .为了便于调试,还可以将日志以信号形式输出到窗口、文件、套接字、控制台等。 您可以自定义实现方法。

注意

1 .不能在此回调函数中的实现中使用qDebug。 如果不使用,则会是死递归。 需要打印调试时,请使用printf和std:out。

2 .注意锁定以支持多线程qDebug ();

如果调用qInstallMessageHandler并传递回调函数指针,则会将qDebug的最后一个输出发送给此回调函数。 QMessageLogContext包含文件名、函数名和行号等信息。 msg是输出的信息。 实现对文件的写入次数即可。

Qt5源代码声明

classqmessagelogcontext { . int version; int line; const char *文件; const char *函数; const char *category; ……; q指定调试输出格式的简单用法示例

int main () qDebug的输出格式qsetmessagepattern('[%{type} )”time yyyy-mm-ddhh : mm 3360 ss.zzz } % ) functio

n}:%{line} %{message}"); qDebug()<<"hello";}

控制台输出

[warning] 2021-08-19 10:10:59.886 main:32 hello输出支持的格式支持字段描述%{appname}QCoreApplication::applicationName()%{category}日志类别%{file}源文件路径%{function}函数名%{line}在源文件中的行号%{message}实际的信息%{pid}QCoreApplication::applicationPid()%{threadid}线程Id%{qthreadptr}当前线程指针%{type}“debug”, “warning”, “critical” or “fatal”%{time process}该进程启动以来的时间%{time boot}自软件运行以来的时间%{time [format]}当前时间,支持自定义时间戳格式%{backtrace [depth=N] [separator="…"]}程序异常时的堆栈信息

默认的输出格式为
“%{if-category}%{category}: %{endif}%{message}”

设置输出格式的方式支持两种,分别是环境变量和函数调用,同时使用时环境变量优先。
指定格式的时候还可以使用类型条件判断,判断条件包含在%{}中%{endif}表示该判断的逻辑结束,可以通过此功能指定不同类型消息的输出标记,以及在控制台,控制不同类型输出不同颜色。

QT_MESSAGE_PATTERN="[%{time yyyyMMdd h:mm:ss.zzz t} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W %{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"

控制台颜色输出代码示例

不同类型的日志前缀不同的颜色码,并且该条日志输出之后,需要恢复颜色到原始状态(33[0m),否则后续第三方库调用printf的输出会一直保持这个颜色,造成颜色显示错乱。

//CLogEvent 为作者自定义的结构体 包含日志类型(debug info...)和函数名、行号等等信息,重点关注不同类型颜色的输出实现void CConsoleAppender::append(CLogEvent &event){ if(event.level < m_enmLevel) return ; static QString arrColor[] = {"","33[32m","33[33m","33[31m","33[35m"};// 默认 绿 黄 红 紫 fprintf(stdout,"%s %sn33[0m",arrColor[event.level].toStdString().c_str(),m_fmtter.fmt(event).toLocal8Bit().constData()); fflush(stdout);}5.pro文件中相关配置#release模式默认不会显示函数名,行号等信息,添加以下即可显示DEFINES += QT_MESSAGELOGCONTEXT#可通过环境变量配置日志格式QT_MESSAGE_PATTERN="[%{time yyyyMMdd h:mm:ss.zzz t} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W %{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。