公用轮子/API
主要存放全局变量,配置变量,一些公用方法代码 还有自定义日志,以及重定向输出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口的高/低电平,接口为静态函数,调用非常简单 便捷。
串口库
可以使用第三方串口库
测试用例:见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
*/
测试用例:见Example/MyNetwork(V1.0.0.4)
WebSocket
基于Qt QWebsocket封装的简单的Server和Client。
测试用例:见Example/websocket_demo
Http/Https
Qt的官方HttpServer库,好像不是很好用,所以使用第三方库,JQHttpServer ,目前我个人所用的http库都是这个。
github:https://github.com/188080501/JQHttpServer
demo:
myHttpClient_v1.2:使用客户端先服务端请求下载文件,并显示下载文件的进度。
myHttpClient:JQHttpServer的客户端使用示例
myHttpServer:JQHttpServer的服务端使用示例
多线程
Qt几种实现多线程方式,如何优雅的实现线程的启动、暂停、复位、退出。这个文件下面有各种姿势的实现多线程的例子。
link:【QT】 Qt多线程的“那些事” - 李春港 - 博客园 (cnblogs.com)
音视频库
audio
使用QSoundEffect独立声音播放线程 movetothread方式
1. 自定义语音类型播放,声音播放优先级最高,单次不循环 会覆盖播放
2. 自定义语音类型播放,声音播放优先级最低,单次不循环 不会覆盖播放
3. 播放第三方文件夹下语音名称,声音播放优先级最高,单次不循环 会覆盖播放
4. 暂停播放
使用方式
#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组件库
-
MaterialUI,谷歌开源UI库
link: GitHub - qml-demo/qml-material: qml-material UI:一款已经封装好的框架材料
-
Toou-2D
以上所有的轮子源码,以及使用demo
下载地址:
Qt轮子包合集下载