当前位置: 首页 > news >正文

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数)

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数)

文章目录

  • Log输出方式
  • qInstallMessageHandler回调函数
  • 线程安全
  • textEdit控件
  • 附录:C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)
    • C语言与C++的不同
    • C++中写C语言代码
    • C语言到C++的知识点
    • Qt开发中需要了解的C++基础知识
      • namespace
      • 输入输出
      • 字符串类型
      • class类
        • 构造函数和析构函数(解析函数)
        • 类的继承

Log输出方式

Qt有Debug、Warning、Info、Critical、Fatal五种级别的调试信息。

qDebug--------调试信息
qWarning--------警告信息
qInfo--------警告信息
qCritical--------严重错误
qFatal--------致命错误

分别由qDebug、qWarning、qCritical、qFatal等函数进行调用

调用时 与cout用法相同
如:

qDebug()<<"timerEvent 1\n";

在进行调试时 可以输出到IDE的终端下面 但是不会在窗口中显示
为了输出到窗口 则需要进行重定向

qInstallMessageHandler回调函数

Qt5提供了qInstallMessageHandler函数
用于申请一个回调

函数原型:

typedef void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &);
Q_CORE_EXPORT QtMessageHandler qInstallMessageHandler(QtMessageHandler);

申请后 每次发生QDebug等数据 都会跳到回调中

我的回调函数如下:

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{static QMutex MessageOutput_Mutex;MessageOutput_Mutex.lock();(void)context;QByteArray localMsg = msg.toLocal8Bit();//信息分类QString strMsg("");switch(type){case QtDebugMsg:strMsg = QString("Debug:");break;case QtInfoMsg:strMsg = QString("Info:");break;case QtWarningMsg:strMsg = QString("Warning:");break;case QtCriticalMsg:strMsg = QString("Critical:");break;case QtFatalMsg:strMsg = QString("Fatal:");break;default:break;}// 设置输出信息格式QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");QString strMessage = QString("%1 %2 %3").arg(strDateTime,strMsg,localMsg.constData());pw->debug_text->insertPlainText(strMessage);MessageOutput_Mutex.unlock();
}

注册方法:

qInstallMessageHandler(myMessageOutput);

几种传参就是类型、位置和消息内容
context位置包括被调用时的文件名、函数名称、行数等等

由于我是直接用Qt Creator直接生成的工程 MainWindow定义的w在mian函数中调用
所以需要用一个全局变量转一下

MainWindow *pw = nullptr;
int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;pw=&w;w.show();return a.exec();
}

消息处理后用

pw->debug_text->insertPlainText(strMessage);

发送到textEdit控件

最终效果
在这里插入图片描述

线程安全

如果你用到了多线程 则可能多次调用QDebug 造成多次回调
则为了安全 加了一个互斥锁

    static QMutex MessageOutput_Mutex;MessageOutput_Mutex.lock();

MessageOutput_Mutex.unlock();

textEdit控件

定义就不讲了 我是用ui直接设计的 但设计的出来都是私有成员 所以得加个公有成员指向他

QTextEdit *debug_text;
debug_text=this->ui->textEdit_2;

可以用函数设置最大行数

debug_text->document()->setMaximumBlockCount(500);

另外 在槽函数textChanged()中 加入下拉框置底的配置

void MainWindow::on_textEdit_2_textChanged()
{this->ui->textEdit_2->moveCursor(QTextCursor::End);
}

附录:C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)

C语言与C++的不同

C语言是一门主要是面向工程的语言
C++则是面向对象

C语言中 某些功能实现起来较为繁琐
比如结构体定义:

一般写作:

typedef struct stu_A
{
}A;

也可以写作:

typedef struct 
{
}A;

但 大括号后面的名称是不可省去的

不过 C++的写法就比较简单
除了支持上述写法外

也支持直接声明

typedef struct A
{
}

另外 C++是完全支持C语言库和语法的
不过C++里面的库也有些很方便的高级功能用法 只不过实现起来可能不如C的速度快

再者 C语言与C++的编译流程不一样
C语言没有函数重载 所以给编译器传参就是直接传函数名称
但是C++除了传函数名称外 还会穿函数的参数、类型等等 以实现函数重载

C++中写C语言代码

上文提到 C++可以完全兼容C的写法
但是编译流程也还是不一样
所以如果在编译层面进行C语言代码编译 则通常用以下方法:

extern "C"
{
...
}

表面大括号内的内容用C的方法进行编译

另外 如果还是用C++的编译器 但要实现C语言函数 则需要用到C语言的库

在C语言中 我们一般用如下方法导入库

#include <stdio.h>

此方法同样适用于C++ 但是C++可以更方便的写成去掉.h的方式
比如:

#include <iostream>

在C++中 为了调用C语言的库 可以采用在原库名称前加一个"c"的方式导入
如:

#include <cstdio>

这样就可以使用printf等函数了 甚至比C++的std方法更快

C语言到C++的知识点

在这里插入图片描述

Qt开发中需要了解的C++基础知识

namespace

C++面向对象的特性下诞生的一个名称
表示某个函数、变量在某个集合下 用作namespace
比如 <iostream>库中的关键字cin在std下 则写作std::cin
std就是namespace
::表示某空间下的某某
前面是空间名称 后面是变量、函数名称

using namespace可以告诉编译器以下都用xx名称空间
比如:

using namespace std;
cout<<"a";

如果没有告诉编译器所使用的空间名称 则要写成:

std::cout<<"a";

同样 可以自定义某一段代码属于哪个空间:

namespace xx
{
...
}

输入输出

在C++中 用iostream作为输入输出流的库

#include <iostream>

用cin和cout关键字进行输入和输出
如:

using namespace std;
int a=0;
cin>>a; //输入到acout<<a;  //输出a

类比scanf和printf
同样 还有一个关键字endl表示换行
cout和cin的传参是不固定的
由编译器自行裁定

字符串类型

在C语言中 常用char *表示字符串
但是在C++中 可以直接用string类型
比如:

char * s="456";
string str="123";

由于cout的特性 这两种字符串都可以直接打印
但如果使用C语言中printf的打印方式时 采用%s方式打印字符串 则不能传入string类型

class类

C++的核心就是class
同Python等支持面向对象的语言一样
可以理解成一个支持函数、继承、自动初始化、销毁的结构体
在class类中 有private私有、public公有变量
前者只能内部访问 后者可以外部调用使用
如:

class A
{
public:
int a;
private:
int b;
}

a可以用A.a的方式方位 b则外部无法访问

构造函数和析构函数(解析函数)

构造函数可以理解成对类的初始化 反之析构函数则是退出时进行销毁前的函数
两者需要与类的名称相同 析构函数则在前面加一个~表示非
如:

class A
{
public:
int a;
A();
~A();
private:
int b;
}A::A()
{
...
}A::~A()
{
...
}

构造函数可以定义传参 析构函数则不行

类的继承

如果有两个类A和B 想让A里面包含B 则可以写作继承的写法
继承后 A类的变量可以直接调用B下面的成员
如:

class B
{
int b;
}
class A: public B
{
int a;
}

在定义A后 可以访问到B的成员b 当然 继承也可以私有

相关文章:

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数)

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件&#xff08;qInstallMessageHandler回调函数&#xff09; 文章目录 Log输出方式qInstallMessageHandler回调函数线程安全textEdit控件附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发…...

【JavaEE精炼宝库】 网络编程套接字——UDP业务逻辑 | TCP流套接字编程及业务逻辑实现

文章目录 一、UDP业务逻辑实现二、TCP流套接字编程2.1 API 介绍&#xff1a;2.1.1 ServerSocket&#xff1a;2.1.2 Socket&#xff1a; 2.2 Java流套接字通信模型&#xff1a;2.3 代码示例&#xff1a;2.3.1 TCP Echo Server&#xff1a;2.3.2 TCP Echo Client&#xff1a;2.3.…...

前端过渡动画

前端过渡动画 vue3 1、组件进入视口时向上移动且渐显 1、创建js文件addViewportEffect.js function slideDownEffect(element) {console.log("执行");element.style.transform translateY(0);element.style.opacity 1; }/*** 添加视口效果到指定的类名元素上。…...

actual combat 38 ——vue

vue-cli脚手架 创建命令&#xff1a;vue create 项目名称 eslint 如何关闭&#xff1f; vue.config.js文件中加 module.exports {lintOnSave: false }文件全代码&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpile…...

测试面试宝典(四十七)— 功能测试用例一般包含哪些内容

首先&#xff0c;明确测试用例的编号和名称&#xff0c;以便于识别和管理。 其次&#xff0c;详细描述测试的目标和背景&#xff0c;让其他人能够清楚了解该测试用例的目的和适用场景。 接着是测试的步骤&#xff0c;需要清晰、准确地列出每一个操作步骤&#xff0c;包括输入…...

rust_mac环境安装

在 macOS 上安装 Rust 很简单。你可以使用 Rust 提供的安装工具 rustup。下面是安装步骤&#xff1a; 打开终端。 运行以下命令以安装 rustup 和 Rust&#xff1a; curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh按照提示进行操作&#xff1a; 这个命令将下载并…...

【前端面试】七、算法-递归

常考算法 排序算法&#xff1a;快速排序、归并排序、堆排序等。 查找算法&#xff1a;二分查找、哈希表查找等。 动态规划&#xff1a;解决最优化问题&#xff0c;如斐波那契数列、最长公共子序列等。 图论算法&#xff1a;最短路径&#xff08;Dijkstra、Floyd-Warshall&am…...

CmsEasy逻辑漏洞--零元购

CmsEasy逻辑漏洞--零元购 选择购买MackBook 购买成功后会员中心发现多出8100快钱 然后就可以正常购买了...

Linux 内核源码分析---I/O 体系结构与访问设备

I/O 体系结构 与外设的通信通常称之为输入输出&#xff0c;一般都缩写为I/O。 在实现外设的I/O时&#xff0c;内核必须处理3个可能出现的问题&#xff1a; &#xff08;1&#xff09;必须根据具体的设备类型和模型&#xff0c;使用各种方法对硬件寻址&#xff1b; &#xff08…...

在cPanelWHM中如何重置 MySQL 用户帐户密码

更改MySQL用户账户密码非常简单。服务器管理员可以在WHM中编辑任何MySQL用户的帐户。cPanel用户可以编辑其帐户管理的数据库的密码。 在WHM中更改MySQL用户帐户密码 打开WHM&#xff0c;在侧边菜单中的SQL服务下选择“Change MySQLUser Password”。Hostease的服务器产品提供稳…...

软件测试基础1--功能测试

1、什么是软件测试&#xff1f; 软件是控制计算机硬件运行的工具。 软件测试&#xff1a;使用技术手段验证软件是否满足使用需求&#xff0c;为了发现软件功能和需求不相符合的地方&#xff0c;或者寻找实际输出和预期输出之间的差异。 软件测试的目的&#xff1a;减少软件缺陷…...

《计算机网络》(第8版)第9章 无线网络和移动网络 复习笔记

第 9 章 无线网络和移动网络 一、无线局域网 WLAN 1 无线局域网的组成 无线局域网提供移动接入的功能&#xff0c;可分为两大类&#xff1a;有固定基础设施的和无固定基础设 施的。 &#xff08;1&#xff09;IEEE 802.11 IEEE 802.11 是无线以太网的标准&#xff0c;是有固定…...

非负数、0和正整数 限制最大值且保留两位小数在elementpuls表单中正则验证

一、结构 <el-form-item label"单价&#xff1a;" prop"price"><el-inputv-model.trim"formData.price"placeholder"请输入"blur"formMethod.fixTwo"><template #append>(元)</template></el-i…...

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介&#xff1a; 二.定时器的构造方法与常见方法&#xff1a; 三.定时器的模拟实现&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 在开发中&#xff0c;我们经常需要一些周期性的操作&#xff0c;例如每隔几分钟就进行某一项操作&#xff0c;这…...

【Linux修行路】进度条小程序

目录 ⛳️推荐 一、预备知识 1.1 回车换行 1.2 缓冲区 二、倒计时 2.1 注意事项 三、进度条 3.1 源代码 3.2 代码分析 3.2 实际使用场景 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…...

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决. 基…...

【探索Linux】P.44(数据链路层 —— 以太网的帧格式 | MAC地址 | MTU | ARP协议)

阅读导航 引言一、认识以太网二、以太网的帧格式三、MAC地址四、MTU五、ARP协议温馨提示 引言 在深入探讨了网络层的IP协议之后&#xff0c;本文将带领读者进一步深入网络的底层——数据链路层。我们将详细解析以太网的帧格式&#xff0c;这是数据链路层传输数据的基本单元&am…...

<数据集>航拍行人识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;7482张 标注数量(xml文件个数)&#xff1a;7482 标注数量(txt文件个数)&#xff1a;7482 标注类别数&#xff1a;1 标注类别名称&#xff1a;[people, pedestrian] 序号类别名称图片数框数1people5226385602pedes…...

在 Windows 10 系统上部署 Medusa

先决条件 在安装 Medusa 之前&#xff0c;你需要确保已经安装了以下工具&#xff1a; Node.js: Medusa 需要 Node.js v16 或更高版本。你可以从 Node.js 官网下载并安装。Git: Git 用于从 GitHub 获取 Medusa 的源代码。你可以从 Git 官网下载并安装。PostgreSQL: Medusa 使用…...

Linux进程 (冯诺依曼体结构 管理 PCB 进程状态 僵尸进程 孤儿进程 运行阻塞挂起状态 进程优先级)

文章目录 一.冯诺依曼体系结构冯诺依曼结构能干什么&#xff1f; 二.操作系统概念结构图(不完整)为什么要有操作系统&#xff1f; 尝试理解操作系统管理结构图(完整)总结&#xff1a; 三.进程进程是什么&#xff1f;PCB为什么要有PCB&#xff1f; Linux中的PCB进程的task_struc…...

《LlamaIndex 之美》-01-LLM、Prompt、Embedding基础入门

在基于数据构建任何 LLM 应用程序时&#xff0c;选择合适的大型语言模型 &#xff08;LLM&#xff09; 是您需要考虑的首要步骤之一。 LLM 是 LlamaIndex 的核心组成部分。它们可以作为独立模块使用&#xff0c;也可以插入到其他核心 LlamaIndex 模块&#xff08;索引、检索器…...

C++ 智能指针简单介绍及用法

C 智能指针简单介绍及用法 智能指针是 C11 引入的一个非常实用的特性&#xff0c;旨在自动管理动态分配的内存&#xff0c;避免内存泄漏和悬空指针问题。主要有三种类型的智能指针&#xff1a;std::unique_ptr、std::shared_ptr 和 std::weak_ptr。下面是对它们的详细介绍&…...

k8s笔记之创建Istio Gateway规则

创建Istio Gateway 背景如何创建Istio Gateway规则配置方式rewrite重写路径直接去除match&#xff0c;默认都转发到一个服务路由规则多种配置方式实践&#xff08;即开头的完整版&#xff09; 涉及的命令补充注意事项 背景 为什么需要使用到Istio Gateway&#xff1f;充当k8s服…...

NAND行业回归盈利:AI与云存储需求驱动

市场概览 根据Yole Group于2024年6月25日发布的市场报告&#xff0c;经过五个季度的亏损之后&#xff0c;NAND闪存行业在2024年第一季度&#xff08;1Q24&#xff09;实现了盈利回归。这一转变主要得益于企业级固态硬盘&#xff08;SSD&#xff09;领域的强劲需求增长&#xf…...

【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…...

从0开始搭建vue + flask 旅游景点数据分析系统( 六):搭建后端flask框架

这一期开始开发header部分&#xff0c;预期实现两个目标&#xff1a; 创建 Flask 项目导入旅游数据后端实现旅游数据的查询 1 python 环境 & 开发环境 python 安装和pycharm安装需要去网上找包&#xff0c;建议python使用3.8 或者3.9版本 2 新建项目 我们新建一个文件…...

学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)

一、触摸按键 1.1理论讲解 1.1.1实验现象 触摸按键 1 单击与长按&#xff0c;控制 LED1&#xff1b;触摸按键 2 单击与长按&#xff0c;控制 LED2;触摸按键 3 单击与长按&#xff0c;控制 LED3;触摸按键 4 单击与长按&#xff0c;控制继电器; 1.1.2硬件电路 是原理图上触摸…...

JS原型链

JS的原型链 文章目录 JS的原型链前言一、原型是什么&#xff1f;二、原型链总结 前言 在使用数组或对象中的方法时&#xff0c;你是不是会感觉很奇怪&#xff0c;为什么仅仅是创建了一个数组或是对象&#xff0c;就能够使用它提供的方法呢&#xff1f;JS是怎么做到的呢&#x…...

《Java初阶数据结构》----5.<二叉树的概念及使用>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…...

git查看记录详解

文章目录 git查看记录查看文件修改列表查看修改差异友好的查看修改记录结合多个选项查看记录示例输出 git查看记录 使用 git log 你不仅可以查看提交记录&#xff0c;还可以通过一些选项查看文件的修改列表、修改差异&#xff0c;并以更友好的方式查看修改记录。以下是一些常用…...

搜索型网站/seo公司seo教程

导读&#xff1a;生活在高压的社会中&#xff0c;在感情这件事情上似乎有越来越多的因素正在困扰着当代的年轻人。在无数次经过广场上跳广场舞的人群时&#xff0c;总能听到长辈们在讨论同一个话题&#xff1a;"现在的年轻人怎么这么不喜欢结婚&#xff1f;"按理说&a…...

营销文案/青岛谷歌优化公司

根据最新发布的联想2012/13财年二季报&#xff0c;联想在各方面都获得了喜人的成绩。季度销售额达87亿美元、市场份额接近16%、每股盈利1.58美元&#xff1b;更关键的是&#xff0c;不仅这些分项数据都创出历史新高&#xff0c;而且“持续12个季度在全球主要个人电脑厂商中保持…...

移动网站建设的前景/seo 技术优化

俗话说的话&#xff0c;没有完整使用过ECS产品的程序员不是好的程序员&#xff08;好吧&#xff0c;其实是我说的&#xff09;。当然&#xff0c;控制台操作或者用OpenAPI也没有必要去写一篇文章&#xff0c;所以那就来点儿有意思的。我们来说说&#xff0c;怎么用Packer和Terr…...

wordpress后台怎么登入/快速建站网站

一个客户需要开发这样的网站&#xff0c;左侧菜单是一个点击展开式菜单&#xff0c;默认是收缩的&#xff0c;点击后会展开带下拉子菜单的网站导航。当用户点击某个子菜单时&#xff0c;当前点击的菜单会变成红色。效果如下图&#xff1a;功能要求&#xff1a;一级菜单下面有多…...

女做受视频网站/经典软文广告

实现简易的基于TCP/IP 协议的聊天室 项目描述&#xff1a;运用 socket 编程,实现了服务端对客户端的广播和转发客户端信息实现客户端聊天操作,并使用 i/o 复用技术中的 epoll 模式解决了一个线程可以处理大量用户连接服务器的请求,提高了服务器并发连接的数量。同时利用线程池…...

云南网站建设公司排名/seo排名赚官网

咸鱼CAD笔记—CAD快捷键功能键CTRL组合键对象特性绘图命令修改命令视窗缩放尺寸标注快捷键&#xff1a;又叫快速键或热键 指通过某些特定的按键、按键顺序或按键组合来完成一个操作&#xff0c;很多快捷键往往与如 Ctrl 键、Shift 键、Alt 键、Fn 键以及Windows 平台下的 Windo…...