公用轮子/API

image-20210521164854299

主要存放全局变量,配置变量,一些公用方法代码 还有自定义日志,以及重定向输出Qt编译器信息到本地文件。

日志库

建以使用mvlog库就ok,跨平台通用库,简单的单例模式,同时可以重定向输出Qt编译器信息(文件名称,函数名称,代码行数等一些信息)。日志有 Debug、Warning、Critiacal、Fatal、Info等。

/* 如何需要定向输出编译器日志,下面段代码放到mian函数中去
  * @brief 定向输出编译器调试信息
  * 请在main函数中加入下面判断条件是否定向输出调试信息
  *    qInfo: 基本信息
  *    qDebug:调试信息
  *    qWarning:警告信息
  *    qCritical:严重错误
  *    qFatal:致命错误
  *     if (App::isOutPutDebuginfo) {
  *     void MessageOutPut(QtMsgType type, const QMessageLogContext &context, const QString &msg);
  *      qInstallMessageHandler(MessageOutPut);
  *   }
  * @param
  *
  * @return
  * 调试信息会输出在程序启动路径下,并且重启程序会自动删除
  *
*/
//文件大小 1mb
const int FILE_SIZE = 1024000;

void MessageOutPut(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static QMutex mutex;
    mutex.lock();
    QString text;
    QString filename;
    switch(type)
    {
    case QtDebugMsg:
        text = QString("Debug:");
        filename = "_debug.log";
        break;

    case QtWarningMsg:
        text = QString("Warning:");
        filename = "_warning.log";
        break;

    case QtCriticalMsg:
        text = QString("Critical:");
        filename = "_critical.log";
        break;

    case QtFatalMsg:
        text = QString("Fatal:");
        filename = "_fatal.log";
        break;

    case QtInfoMsg:
        text = QString("Info:");
        filename = "_info.log";
        break;

    default:
        break;
    }
    //日志写到文件
    QString current_dt = QDateTime::currentDateTime().toString("[yyyy-MM-dd-HH-mm-ss-zzz] ");
    //QString context_info = QString("File:(%1) Line:(%2) Function:(%3)").arg(QString(context.file)).arg(context.line).arg(context.function);
    QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
    QString message = QString("%1%2  %3   %4").arg(current_dt).arg(text).arg(context_info).arg(msg);
    //QString LOG_FILE  =  "C:/"+filename;
    QString LOG_FILE  =  App::appPath+"/"+App::appName+filename;

    QFile debfile(LOG_FILE);
    debfile.open(QIODevice::WriteOnly | QIODevice::Append);
    //日志文件大小大于1m就清空
    if (debfile.size() > FILE_SIZE) {
        debfile.close();
        debfile.open(QIODevice::WriteOnly | QIODevice::Truncate);
    }
    QTextStream text_stream(&debfile);
    text_stream << message << "\r\n";
    text_stream.flush();   //刷新缓冲区
    debfile.flush();
    //不建议频繁打开关闭日志文件,IO性能瓶颈很大
    debfile.close();
    mutex.unlock();
}

log4qt是开源的日志框架系统。使用起来比较麻烦。

GPIO

简单的控制GPIO口的高/低电平,接口为静态函数,调用非常简单 便捷。
在这里插入图片描述

串口库

可以使用第三方串口库

image-20210531194749708

测试用例:见Example/comtool

网络库

TCP/UDP

/**
*@projectName MyNetwork
*@brief  version V1.0.0.1
* 1: 四种模式,tcp客户端、tcp服务器、udp客户端、udp服务器
* 2:支持多个客户端连接并发
* 3:支持服务端单播,多播,指定断开,全部断开
* 4: 采用单线程
* 2020-06-03 version V1.0.0.2 新增:
* 5: TCP传输 json对象 byte数组  自定义结构体
*
* 2020-11-20 version V1.0.0.3 新增:
* 6: UDP传输字节数组
* 7:TCP在发送数据时使用flush及时刷新
*
*author zlozl
*date 2020-06-03
*/

/* [Commit]
 * 1.新增UDP广播
 *
 * Version:   V1.0.0.2
 * Date:      2021-05-08
 * Author:    zlozl
 */

image-20210601090548788

测试用例:见Example/MyNetwork(V1.0.0.4)

WebSocket

基于Qt QWebsocket封装的简单的Server和Client。

image-20210601090619518

测试用例:见Example/websocket_demo

Http/Https

Qt的官方HttpServer库,好像不是很好用,所以使用第三方库,JQHttpServer ,目前我个人所用的http库都是这个。

githubhttps://github.com/188080501/JQHttpServer

image-20210601092011318

demo:

myHttpClient_v1.2:使用客户端先服务端请求下载文件,并显示下载文件的进度。
myHttpClient:JQHttpServer的客户端使用示例
myHttpServer:JQHttpServer的服务端使用示例

在这里插入图片描述

多线程

Qt几种实现多线程方式,如何优雅的实现线程的启动、暂停、复位、退出。这个文件下面有各种姿势的实现多线程的例子。

image-20210531192343838

link:【QT】 Qt多线程的“那些事” - 李春港 - 博客园 (cnblogs.com)

音视频库

audio

使用QSoundEffect独立声音播放线程 movetothread方式

1. 自定义语音类型播放,声音播放优先级最高,单次不循环 会覆盖播放
2. 自定义语音类型播放,声音播放优先级最低,单次不循环 不会覆盖播放
3. 播放第三方文件夹下语音名称,声音播放优先级最高,单次不循环 会覆盖播放
4. 暂停播放

image-20210601092359507

使用方式

#include "audiothread.h"
...
   //自定义声音播放线程
    AudioThread audio_1;
    AudioThread audio_2;
..
    
    audio_1.play(VOICE_TYPE::VOICE_RECOPSAA);
	audio_2.play(VOICE_TYPE::VOICE_TOOFAR);

vedio

OpenCV版本:

纯OpenCV取帧显示+人脸算法/活体检测一些应用

在这里插入图片描述

OpenGL版本:

使用岳超的mvcamera库 对usb单/双目镜头取帧后的yuv图像通过QOpenGLWidget渲染显示YUV图像数据,示例demo如下

在这里插入图片描述

QWidget

一些QWidget常用的方法

1.//右下角弹出框类
2.//托盘图标类
3.//弹出信息框类
4.//弹出输入框类
5.//弹出日期选择对话框
6.//图形字体处理类
7.//全局静态UI方法类
8.//widget样式表

在这里插入图片描述

QML

推荐两个开源的QML UI组件库

image-20210531192932183

  1. MaterialUI,谷歌开源UI库

    link: GitHub - qml-demo/qml-material: qml-material UI:一款已经封装好的框架材料

  2. Toou-2D

    link: Toou 2D 拿来即用,为简单而生。 | Toou-2D

以上所有的轮子源码,以及使用demo
在这里插入图片描述
下载地址:
Qt轮子包合集下载

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐