Qt for Android代码中输出日志

复制代码
#include <QtDebug>

qInfo() << "hello";

如上,加入头文件(注意:这里的头文件是QtDebug,不是QDebug,也不知道啥时候改的,也不知道有啥区别,先这样吧)后使用qInfo来输出日志,用qDebug()输出不了(妈的。。浪费老子好长时间。。一种植物)。USB线连上自己的手机后,Qt Creator里点击运行,Qt Creator底下的"应用程序输出"一栏会打印出用qInfo()输出的日志。但是这样有个问题,就是手机上退出app后重新打开app,Qt Creator里是打印不了日志的,因为在退出app时就相当于退出运行调试了。那么该怎么办呢?怎么才能在手机重新打开app时还能看到日志输出呢?

这里用到了 Android SDK里的adb工具。

打开此电脑,空白处右键选择属性→左侧选择高级系统设置→高级→环境变量→在系统变量里找到变量为Path的,双击打开,点击新建,把自己电脑里Android SDK目录下adb的绝对路径输入进去,我的是 E:\android-sdk\android-sdk\platform-tools,然后就是各种点确定保存。这时候环境变量设置好了,那么在哪里用cmd打开控制台输入adb指令都能正常了。

我常用的指令是:

复制代码
adb logcat -c

应该是清空日志记录的功能?clear。

复制代码
adb logcat -v time -s Tag

仅仅显示指定标签的日志信息,同时显示日志时间。比方 adb logcat -v time -s qnote 。仅仅显示标签为 qnote 的日志信息;假设你想同一时候过滤多个标签,能够用英文半角逗号分隔标签。如 adb logcat -v time -s qnote,test 。

代码工程里加入两个文件:

qDebug2Logcat.h:

cpp 复制代码
#ifndef QDEBUG2LOGCAT_H

#define QDEBUG2LOGCAT_H

#include <QtMsgHandler>

#ifdef ANDROID

void installLogcatMessageHandler(const char *TAG);

#else

#define installLogcatMessageHandler(TAG)

#endif

#endif // QDEBUG2LOGCAT_H

qDebug2Logcat.cpp:

cpp 复制代码
#if defined(ANDROID)

#include "qDebug2Logcat.h"

#include <android/log.h>

#include <QDebug>

#include <QByteArray>

static const char *g_TAG = 0;

static void messageOutput2Logcat(QtMsgType type,

    const QMessageLogContext &context,

    const QString &msg)

{

    int prio = ANDROID_LOG_VERBOSE;

    QByteArray localMsg = msg.toLocal8Bit();

    switch (type) {

    case QtDebugMsg:

        prio = ANDROID_LOG_DEBUG;

        break;

    case QtWarningMsg:

        prio = ANDROID_LOG_WARN;

        break;

    case QtCriticalMsg:

//        prio = ANDROID_LOG_INFO;
        prio = ANDROID_LOG_ERROR;

        break;

    case QtFatalMsg:

        prio = ANDROID_LOG_FATAL;

//        abort();
        break;

    case QtInfoMsg:

        prio = ANDROID_LOG_INFO;

        break;

    default:
        break;

    }

    __android_log_write(prio, g_TAG, localMsg.data());

}

void installLogcatMessageHandler(const char *TAG)

{

    g_TAG = (TAG == 0 ? "QDebug" : TAG);

    qInstallMessageHandler(messageOutput2Logcat);

}

#endif

然后在 main() 函数前包括 qDebug2Logcat.h 头文件,在 main() 函数体第一行增加以下的代码:

cpp 复制代码
installLogcatMessageHandler("yourLogTag");

到这里就OK了,现在无论在main()函数里,还是在自己的窗口类函数中,用qInfo()都能输出日志。

cmd打开命令行控制台,输入

cpp 复制代码
adb logcat -v time -s yourLogTag

这里的yourLogTag就是main()函数里的yourLogTag,可以自定义编辑。

输入后Qt Creator里运行程序,底下的"应用程序输出"一栏会打印出用qInfo()输出的日志,同时cmd命令行也能打印出日志。手机上退出app后重新打开app,Qt Creator里打印不了日志,但cmd命令行还是能打印出日志。

参考链接:

链接1

链接2

链接3

相关推荐
longxibo8 小时前
【AIBIZ低代码平台:能长出业务系统的平台】
android·低代码·rxjava
AI_Gump16 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
疯华整猫21 小时前
否决 Flutter 提案那天,我发现自己也说不清 Framework 管什么
android
ShineWinsu1 天前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
传奇开心果编程1 天前
【Flutter踩坑排雷】第25课:ScrollController 误用坑|跳转失效、监听泄漏与“控制器未附加”
android·flutter·ios·移动开发·跨平台·dart·声明式ui
慕容雪_2 天前
Capacitor8-Android打包完整手册
android·打包·capacitor
阿杰m2 天前
Android源码第十三章:Bluetooth——沿一次发现走到控制器
android
booboosui2 天前
派活给另一个 AI:前后两次文件夹快照,就是交付清单
android
普通人62 天前
MySQL_FIND_IN_SET函数详解
android·数据库·mysql
好的佩奇2 天前
Dart 之集合元素
android·flutter·dart