分类目录归档:开源项目

CGraph

CGraph中文名为【色丶图】,是一套无任何第三方依赖的跨平台图流程执行框架。通过GPipeline(流水线)底层调度,实现了依赖元素依次顺序执行、非依赖元素并发执行的调度功能。

纯C++开发,跟Qt没啥关系,但是如果跟Qt 的QGraphicsView框架的流程图结合在一起,就可以实现强大的流程图编辑,调度功能。

1,源码地址

https://github.com/ChunelFeng/CGraph?tab=readme-ov-file

OpenBoard

OpenBoard 是一款开源跨平台交互式白板教学软件,主要供学校和大学使用。 它既可以与交互式白板一起使用,也可以在带有手写板显示屏和投影仪的双屏设置中使用。

利用的是Qt的QGraphicsView框架,可绘制圆,矩形,文字等基本图形,还能嵌套网页,文档,媒体等控件。

1,主页地址

https://openboard.ch/index.en.html

2,源码地址

https://github.com/OpenBoard-org

直播

一,OBS

OBS是一个免费的开源的视频录制和视频实时推流软件。并同时支持多种平台。

1,主页地址

https://obsproject.com

2,源码地址

https://github.com/obsproject/obs-studio

二,streamlabs

基于OBS开发的一款直播软件,增加了登录,聊天,商城的功能,界面使用Electron开发,底层推流部分使用OBS。比OBS更漂亮,功能更多。

1,主页地址

https://streamlabs.com/zh-cn/streamlabs-live-streaming-software

2,源码地址

https://github.com/stream-labs

播放器

一,VLC

VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。

1,主页地址

https://www.videolan.org/

2,源码地址

https://github.com/videolan/vlc

二,QtAV

基于Qt和FFmpeg的跨平台高性能音视频播放框架。

1,主页地址

https://www.qtav.org

2,源码地址

https://github.com/wang-bin/QtAV

三,smplayer

1,主页地址

https://www.smplayer.info

2,源码地址

https://github.com/smplayer-dev/smplayer

日志

一,需求
软件上线后,出现问题再去排查,看日志是第一步,那就需要一个专业的日志框架,这里推荐spdlog,多线程安全,使用简单,基本功能都具备。
二, 使用
1, 将源码放到工程目录下。
https://github.com/gabime/spdlog

2,写一个单列 来配置日志和调用日志。

#pragma once

#include <QCoreApplication>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/async.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <iostream>
#include <QDateTime>

class XLogger
{
public:
    static XLogger* getInstance()
    {
        static XLogger xlogger;
        return &xlogger;
    }

    std::shared_ptr<spdlog::logger> getLogger()
    {
        return m_logger;
    }
private:
    XLogger()
    {
        try
        {
            //日志等级 可以从配置文件读取
            spdlog::level::level_enum level = spdlog::level::debug;
            const QString logger_name = QCoreApplication::applicationDirPath() + "\\log\\" +QDateTime::currentDateTime().toString("yyyy-MM-dd") + ".log";

            auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
            //文件大小 限制,日志命名
            auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logger_name.toStdString(), 100 * 1024 * 1024, 1000);

            console_sink->set_pattern("%Y-%m-%d %H:%M:%S.%f [%l] [%@] %v");
            file_sink->set_pattern("%Y-%m-%d %H:%M:%S.%f [%l] [%@] %v");

            //这里即输出到控制台 也写到文件
            console_sink->set_level(level);
            file_sink->set_level(level);

            std::vector<spdlog::sink_ptr> sinks;
            sinks.push_back(console_sink);
            sinks.push_back(file_sink);

            m_logger = std::make_shared<spdlog::logger>("multi-sink", begin(sinks), end(sinks));
            m_logger->set_level(spdlog::level::trace);
            m_logger->flush();
        }
        catch (const spdlog::spdlog_ex& ex)
        {
            std::cout << "Log initialization failed: " << ex.what() << std::endl;
        }
    }

    ~XLogger()
    {
        spdlog::drop_all();
    }

    void* operator new(size_t size)
    {}

    XLogger(const XLogger&) = delete;
    XLogger& operator=(const XLogger&) = delete;

private:
    std::shared_ptr<spdlog::logger> m_logger;
};

#define LOGT(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::trace, __VA_ARGS__)
#define LOGD(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::debug, __VA_ARGS__)
#define LOGI(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::info, __VA_ARGS__)
#define LOGW(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::warn, __VA_ARGS__)
#define LOGE(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::err, __VA_ARGS__)

3, 使用的时候 直接使用宏即可。


//没有参数
LOGI("Camera close!");

//携带参数
int index=0;
LOGI("{} close!",index);