本帖最后由 baizy77 于 2019-7-2 20:28 编辑
版权声明--------------------------------------------------------------------------------------------------------------------- 作者: 女儿叫老白 转载请注明出处! ---------------------------------------------------------------------------------------------------------------------
引言 ---------------------------------------------------------------------------------------------------------------------- 在开发C/S模式的软件时,我们的服务端程序经常运行在两种模式下: 模式1: 终端模式 也就是命令行模式。此时,模块运行在终端里,我们可以看到模块在终端里的输出信息,可以在终端输入命令以调整模块的行为。 模式2:后台模式 也就是类似windows的服务模式。此时,模块以后台进程方式运行,而且没有任何界面。我们无法通过终端查看模块状态或者输入命令,因为根本就没有终端。这种情况下,一般是给服务器加电后就不管了,也就是服务器加电启动后自行进入操作系统并且自动启动我们预先配置好的服务。这种模式无需人员干预,所以对用户来说非常方便。 我们通常在软件中通过命令行参数的方式区分这两种模式,如果软件运行在模式1则将输出信息发送到标准输出(也就是命令行),如果软件运行在模式2则将输出信息保存到文件。 那么该怎么实现这样的功能呢? 正文 ---------------------------------------------------------------------------------------------------------------------- Qt提供了qDebug()来实现标准输出功能。其实严格来说qDebug()不是类,我们只是为了课程组织方便才统一称作常用Qt类。我们分为4种场景介绍qDebug()相关的应用: 1. qDebug()<<方式输出信息 2. 使用qDebug("%")格式化输出信息 3. 将自定义类输出到qDebug 下面我们分别看一下。 场景1. qDebug()<< 方式输出信息 该场景下,我们使用<<操作符实现信息输出。 example01: ---------------------------------------------------------------------------------------------------------------------- /** * @brief qDebug()<< 方式输出信息 * 可以直接用<<操作符将需要输出的信息输出到qDebug()。 * @return 无 */ void example01(){
int iVal = 334; QString str ="I live in China"; qDebug()<< "My Value is " << iVal << ". "<< str; qWarning()<< "My Value is " << iVal << ". "<< str; qCritical()<< "My Value is " << iVal << ". "<< str; } ---------------------------------------------------------------------------------------------------------------------- 从上述代码可以看出,使用<<操作符将变量输出到qDebug()的方法同cout类似。只需要把变量左移到qDebug()即可。Qt的常用类都可以输出到qDebug(),原生数据类型也是。这种用法比较简单也比较常用。qWarning()、qCritical()的用法与之相同,只是严重等级不同。
场景2. 使用qDebug("%")格式化输出信息 example02: ---------------------------------------------------------------------------------------------------------------------- /** * @brief 使用qDebug("%")格式化输出信息 * @return 无 */ void example02(){ QStringstr = "China"; QDateTimedt = QDateTime::fromTime_t(time(NULL)); qDebug("Ilive in %s. Today is %04d-%02d-%02d", str.toLocal8Bit().data(), dt.date().year(),dt.date().month(), dt.date().day()); qWarning("Ilive in %s. Today is %04d-%02d-%02d", str.toLocal8Bit().data(), dt.date().year(),dt.date().month(), dt.date().day()); qCritical("Ilive in %s. Today is %04d-%02d-%02d", str.toLocal8Bit().data(), dt.date().year(),dt.date().month(), dt.date().day()); //下面两行代码如果解封,其功能是弹出异常界面,并显示我们给出的异常信息。 //qFatal("Ilive in %s. Today is %04d-%02d-%02d", str.toLocal8Bit().data(), // dt.date().year(), dt.date().month(),dt.date().day()); } ---------------------------------------------------------------------------------------------------------------------- 该场景下,我们使用类似sprintf()的方式实现信息的格式化输出。我们可以使用%的语法把信息格式化。这种方法也比较容易理解。qWarning()、qCritical()、qFatal()的用法与之相同。需要注意的是上述代码中封掉的内容,如果解封其正常运行的效果是弹出异常界面,因为qFatal()的功能既是如此。 场景3. 将自定义类输出到qDebug 该场景介绍将自定义类输出到qDebug。 myclass.h: ---------------------------------------------------------------------------------------------------------------------- /*! \file: myclass.h \brief exe+dll编程示例,引出类的定义头文件 \author 星点课堂:女儿叫老白 \Date2018/9 */
#ifndef _MYCLASS_DLL_H #define _MYCLASS_DLL_H #include <QDebug> #include <QString>
class CMyClass { public: //构造函数 CMyClass():m_id(0){}
//析构函数 ~CMyClass(){}
/** *@brief 设置id *@param[in] id id */ voidsetId(int id) { m_id = id; } /** *@brief 获取id *@return id */ intgetId() const { return m_id; }
/** *@brief 设置名字 *@param[in] name 名字 */ voidsetName(const QString& str) { m_strName = str; } /** *@brief 获取名字 *@return 名字 */ QStringgetName() const { return m_strName; } private: intm_id; QStringm_strName; }; QDebugoperator<<(QDebug debug, const CMyClass &mc); #endif // _MYCLASS_DLL_H ---------------------------------------------------------------------------------------------------------------------- myclass.cpp: ---------------------------------------------------------------------------------------------------------------------- /*! \file: myclass.cpp\brief \author 星点课堂:女儿叫老白 \Date 2018/9
*/ #include "myclass.h" /////////////////////////////////////////////////////////////////// QDebug operator<<(QDebug debug,const CMyClass &mc) { debug<< "My id is " << mc.getId() << ", My Name is" << mc.getName() << ""; returndebug; } ---------------------------------------------------------------------------------------------------------------------- example03: ---------------------------------------------------------------------------------------------------------------------- /** * @brief 将自定义类输出到qDebug * @param[in] mc 自定义类 * @return */ void example03(){ CMyClassmc; mc.setId(10000); mc.setName(QString::fromLocal8Bit("秦始皇")); qDebug()<< mc; } ---------------------------------------------------------------------------------------------------------------------- 为了实现自定义类输出到qDebug,我们为自定义类CMyClass编写全局重载接口: QDebugoperator<<(QDebug debug, const CMyClass &mc); 在该接口中,将自定义类的数据输出到qDebug()。 然后就可以使用qDebug() << mc完成CMyClass类对象到qDebug()的输出了。
结语 ---------------------------------------------------------------------------------------------------------------------- 向命令行中输出日志或者将日志输出到文件是最最常用的调试手段了,这对我们分析软件运行状态非常有效,而且实现起来也非常简单。本节所列的内容并非仅能用在服务类模块中,这些技术也可以用在界面类软件中。希望本节内容能帮到大家。 您还希望学习如何将标准输出重定向到文件吗?请来支持一下 [课程视频]吧!
|