记录下比较好用的一些开源库
1. Qt中的日志库“log4qt”
log4qt 是一个基于 Apache Log4j 设计理念的 Qt 日志记录库,它为 Qt 应用程序提供了强大而灵活的日志记录功能。Log4j 是 Java 领域广泛使用的日志框架,log4qt 借鉴了其优秀的设计思想,让 Qt 开发者可以方便地在 C++ 代码中实现类似的日志记录机制;log4qt”开源库基本可以满足中小型项目的各种日志需求,特别优点是能很好的嵌入到Qt开发的项目中,自动打印出Qt本身的一些警告或错误,这块其实很有用,往往是一些问题的本源;
可以从 log4qt 的官方 GitHub 仓库(https://github.com/MEONMedical/log4qt)下载最新的源码。解压源码包后,进入源码目录,使用 Qt 的 qmake 和 make 工具进行编译和安装。在项目的 .pro 文件中添加对 log4qt 库的引用。
在应用程序的 main 函数中,需要对 log4qt 进行初始化。以下是一个简单的初始化示例
#include <QCoreApplication>
#include <Log4Qt/Logger>
#include <Log4Qt/BasicConfigurator>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 基本配置,将日志输出到控制台Log4Qt::BasicConfigurator::configure();// 获取根日志记录器Log4Qt::Logger* logger = Log4Qt::Logger::root();// 记录日志logger->debug("Debug message");logger->info("Info message");logger->warn("Warning message");logger->error("Error message");logger->fatal("Fatal message");return a.exec();
}
2. 图表开源库“QCustomPlot”
QCustomPlot是一个基于Qt画图和数据可视化的C++控件。在Qt下的绘图工具有Qwt、QChart和QCustomPlot,在绘制大量数据(10万个点以上)时选择QCustomPlot优势比较明显,可以将XY轴对调,然后形成横向的效果,无论是曲线图还是柱状图,分组图、堆积图等,都支持这个特性。
功能特点:一个用于绘制各种 2D 图表的 Qt 库,支持折线图、柱状图、散点图、饼图等多种图表类型。它具有高度的可定制性,能够自定义图表的外观、坐标轴、标签等。可以方便地添加数据、更新图表,并且支持交互操作,如缩放、平移等。
如下:在 Qt 项目中,使用QCustomPlot可以轻松创建一个简单的折线图
#include "qcustomplot.h"
#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);QCustomPlot *customPlot = new QCustomPlot();// 创建一个折线图customPlot->addGraph();QVector<double> x(101), y(101);for (int i = 0; i < 101; ++i) {x[i] = i / 50.0 - 1;y[i] = x[i] * x[i];}customPlot->graph(0)->setData(x, y);customPlot->rescaleAxes();customPlot->replot();customPlot->show();return a.exec();
}
3. SQLite数据库
功能特点:SQLite 是一个轻量级的嵌入式数据库,它将整个数据库存储在一个单一的文件中,无需单独的服务器进程。Qt 提供了对 SQLite 的原生支持,通过 QSqlDatabase 和 QSqlQuery 等类可以方便地进行数据库操作,如创建表、插入数据、查询数据等。
适用场景:适合开发小型应用程序、嵌入式系统等,对数据库性能要求不是特别高的场景。
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");if (db.open()) {QSqlQuery query;query.exec("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT)");query.exec("INSERT INTO test (name) VALUES ('John')");query.exec("SELECT * FROM test");while (query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}db.close();}return a.exec();
}
4. QtWebSockets网络库
功能特点:Qt 提供的用于实现 WebSocket 通信的模块,支持客户端和服务器端的开发。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实时数据传输的场景。
适用场景:常用于开发实时聊天应用、实时监控系统、在线游戏等。
以下是一个简单的 WebSocket 客户端示例
#include <QCoreApplication>
#include <QWebSocket>
#include <QDebug>class WebSocketClient : public QObject {Q_OBJECT
public:WebSocketClient(const QUrl &url, QObject *parent = nullptr) : QObject(parent), m_url(url) {connect(&m_webSocket, &QWebSocket::connected, this, &WebSocketClient::onConnected);connect(&m_webSocket, &QWebSocket::disconnected, this, &WebSocketClient::closed);m_webSocket.open(QUrl(m_url));}private slots:void onConnected() {qDebug() << "Connected to server";m_webSocket.sendTextMessage("Hello, server!");}void closed() {qDebug() << "Disconnected from server";}private:QWebSocket m_webSocket;QUrl m_url;
};#include "main.moc"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);WebSocketClient client(QUrl("ws://localhost:1234"));return a.exec();
}
5. QML Material 库
QML Material 是一个基于 Qt Quick(QML)实现的 UI 组件库,它遵循 Google 的 Material Design 设计语言。Material Design 是一种由 Google 推出的设计规范,强调使用简洁、直观的界面元素和富有层次感的视觉效果,以提供统一且美观的用户体验。QML Material 库将这些设计理念融入到 Qt 应用程序开发中,使得开发者可以轻松创建出具有现代感和时尚感的用户界面。
在 QML 文件中,导入 QML Material 库,使项目可以使用该库提供的组件,这样QML文件中就可以直接使用 QML Material 提供的组件。
这是QML Material 库源码自带的demo,可以先欣赏一下
源码在github上的QML Material库 源码
编译src的时候要注意,在src的.pro文件中去掉这两行(自己生成不了目标目录,得手动做)
然后将src文件夹中的qmldir文件中的“# plugin material”前面的#号去掉,将src文件夹中修改的的qmldir文件在临时构建目录中添加一个out文件夹,将src文件夹中修改的的qmldir文件拷贝一份到out文件夹,在项目->构建设置->make arguments中加上“install”,表示编译完安装到Qt的安装目录(比如我是MSVC编译,我的就安装在“C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\qml\Material”中),安装完记得删除make arguments中加上的“install”再编译其他工程(比如编译他的demo)。
以下是一个简单的示例,展示了如何使用 Material.Button 组件
import QtQuick 2.15
import QtQuick.Window 2.15
import Material 1.0Window {visible: truewidth: 640height: 480title: "QML Material Example"Material.Button {text: "Click me"anchors.centerIn: parentonClicked: {console.log("Button clicked!")}}
}
6. QSingleApplication 库
QSingleApplication 是一个用于确保应用程序在系统中只能有一个实例运行的 Qt 库。在很多实际应用场景中,我们不希望同一个应用程序同时打开多个实例,例如某些配置工具、系统监控程序等,多次打开可能会导致资源冲突、数据不一致等问题。QSingleApplication 库通过使用系统级的锁机制(如共享内存、命名管道等)来检测应用程序是否已经有实例在运行,如果有则将新启动的实例的操作(如命令行参数传递、激活已有实例窗口等)转发给已有实例,从而保证应用程序的单实例运行。
QSingleApplication 使用简单,包含了头文件后,在 main 函数中,使用 QSingleApplication 替代 QApplication 来创建应用程序实例
#include <QDebug>
#include "qsingleapplication.h"int main(int argc, char *argv[])
{QSingleApplication app(argc, argv, true);// 检查是否已经有实例在运行if (app.isRunning()) {// 如果已有实例运行,将新实例的消息(如命令行参数)发送给已有实例app.sendMessage("New instance started with args: " + QStringList(app.arguments()).join(" "));return 0; // 退出新实例}// 这里开始编写你的应用程序主逻辑// 例如创建主窗口等// ...return app.exec();
}
7. QtAdvancedStylesheets工具
QtAdvancedStylesheets 是一个用于增强 Qt 应用程序样式表功能的工具。在 Qt 开发中,样式表(QSS)是一种强大的机制,用于自定义应用程序的外观,而 QtAdvancedStylesheets 在此基础上进行了扩展,提供了更多高级的样式特性和功能,帮助开发者更轻松地创建出美观、独特且富有交互性的用户界面。
丰富的样式特性:支持更多复杂的样式效果,如渐变、阴影、圆角等,能够让界面元素呈现出更加立体和现代的外观。
动态样式更新:允许在运行时动态修改样式,实现一些动画效果或根据用户操作改变界面外观,增强用户交互体验。
自定义选择器:提供了自定义选择器的功能,使得样式规则的应用更加灵活,可以根据特定的条件或属性来选择界面元素进行样式设置。
跨平台兼容性:基于 Qt 框架,继承了 Qt 的跨平台特性,可以在 Windows、Linux、macOS 等多种操作系统上使用。
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include "QtAdvancedStylesheets.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建一个主窗口和一个按钮QWidget window;QPushButton button("Click me", &window);button.move(50, 50);// 加载样式表文件QString styleSheet = QtAdvancedStylesheets::parseStyleSheetFromFile("styles.qss");// 应用样式表到应用程序app.setStyleSheet(styleSheet);window.show();return app.exec();
}
QtAdvancedStylesheets::parseStyleSheetFromFile(“styles.qss”) 函数用于从指定的文件中解析样式表内容。这里的 “styles.qss” 是你自定义的样式表文件,你可以在其中编写 QtAdvancedStylesheets 支持的样式规则。
他还有个巨牛的接口QtAdvancedStylesheets::mergeStyleSheets 函数,用于合并当前样式表和新的样式表,然后将合并后的样式表应用到应用程序,实现样式的动态更新
8. QtWebApp库
QtWebApp 是一个基于 Qt 框架开发的轻量级 Web 应用程序框架,用于快速构建 Web 服务器和 Web 应用。它提供了简单易用的 API,使得开发者能够方便地处理 HTTP 请求、响应,管理会话,以及实现动态网页等功能。该库适用于开发各种类型的 Web 应用,如 Web 服务接口、小型 Web 网站等。
可以从 QtWebApp 的开源仓库(GitHub)下载其源码,将下载的源码文件添加到你的 Qt 项目中。一般需要包含头文件和源文件,并在项目配置文件(如 .pro 文件)中添加相应的源文件路径。
例如使用 QtWebApp 搭建一个简单的 Web 服务器:
#include <QtCore/QCoreApplication>
#include "httplistener.h"
#include "requestmapper.h"// 配置文件
QSettings* settings = new QSettings("config.ini", QSettings::IniFormat, 0);// 主函数
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建 HTTP 监听器new HttpListener(settings, new RequestMapper(&a), &a);return a.exec();
}
//请求映射器 RequestMapper
#include "requestmapper.h"
#include "staticfilecontroller.h"
#include "templatecontroller.h"extern QSettings* settings;// 静态文件控制器
StaticFileController* staticFileController = new StaticFileController(settings, &requestMapper);// 模板控制器
TemplateController* templateController = new TemplateController(&requestMapper);RequestMapper::RequestMapper(QObject* parent) : HttpRequestHandler(parent) {// 初始化代码
}void RequestMapper::service(HttpRequest& request, HttpResponse& response) {QByteArray path = request.getPath();// 处理静态文件请求if (path.startsWith("/static")) {staticFileController->service(request, response);} // 处理模板请求else if (path.startsWith("/template")) {templateController->service(request, response);} // 其他请求else {response.setStatus(404, "Not found");response.write("The URL is wrong, no such document.", true);}
}
//模板控制器
#include "templatecontroller.h"
#include "template.h"TemplateController::TemplateController(QObject* parent): HttpRequestHandler(parent) {// 初始化代码
}void TemplateController::service(HttpRequest& request, HttpResponse& response) {// 加载模板文件Template t=templateCache->getTemplate("index",request.getHeader("Accept-Language"));// 设置模板变量t.setVariable("message", "Hello, World!");// 生成 HTML 内容QByteArray html = t.toUtf8();// 设置响应头response.setHeader("Content-Type", "text/html; charset=UTF-8");// 发送响应内容response.write(html, true);
}
再加一个ini配置文件
[listener]
port=8080
minThreads=1
maxThreads=10
cleanupInterval=1000
readTimeout=60000
maxRequestSize=16000
maxMultiPartSize=1000000
9. Qwt库
Qwt库(Qt Widgets for Technical Applications)是一个基于 Qt 框架开发的开源 C++ 类库,专门用于开发技术应用程序中的图表和绘图功能。它提供了一系列丰富的组件和工具,能够帮助开发者快速、高效地创建各种专业级的 2D 图表和绘图界面,广泛应用于科学研究、工程计算、数据监测等领域。
丰富的图表类型:支持多种常见的图表类型,如折线图、柱状图、饼图、散点图、极坐标图等,满足不同场景下的数据可视化需求。
高度可定制性:Qwt 中的每个组件都具有高度的可定制性,开发者可以对图表的外观(如颜色、线条样式、字体等)、坐标轴、刻度、标签等进行细致的设置,以实现个性化的视觉效果。
交互功能:提供了一些交互功能,如鼠标缩放、平移、数据点提示等,增强了用户与图表的交互体验,方便用户对数据进行深入分析。
跨平台兼容性:由于基于 Qt 框架,Qwt 继承了 Qt 的跨平台特性,可以在 Windows、Linux、macOS 等多种操作系统上运行。
可以从 Qwt 的官方网站(http://qwt.sourceforge.net/)下载最新的源码包,解压源码包后,进入源码目录,使用 Qt 的 qmake 和 make 工具进行编译和安装。在需要引入的项目的 .pro 文件中添加对 Qwt 库的引用。
以下简单展示如何使用 Qwt 库创建一个折线图
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <qwt_point_data.h>
#include <vector>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建一个 QwtPlot 对象QwtPlot plot;plot.setWindowTitle("Simple Qwt Plot");plot.insertLegend(new QwtLegend());// 准备数据std::vector<double> x = {1, 2, 3, 4, 5};std::vector<double> y = {2, 4, 6, 8, 10};QwtPointArrayData data(x.data(), y.data(), static_cast<int>(x.size()));// 创建一个 QwtPlotCurve 对象QwtPlotCurve *curve = new QwtPlotCurve("Line Curve");curve->setData(data);curve->setPen(Qt::blue, 2); // 设置曲线的颜色和宽度curve->attach(&plot); // 将曲线附加到 QwtPlot 上// 显示图表plot.show();return a.exec();
}
10.精美控件库qskinny库
qskinny 是一个轻量级、跨平台的 Qt Quick 控件库,它专为创建具有高性能和自定义外观的用户界面而设计。它基于 Qt Quick 技术,提供了一系列丰富的控件,可用于开发各种类型的应用程序,包括嵌入式系统、桌面应用和移动应用等。
qskinny 的设计注重资源的高效利用,它的代码量相对较小,运行时占用的内存和 CPU 资源也较少,非常适合在资源受限的设备上运行。
可以从 qskinny 的官方 GitHub 仓库(https://github.com/uwerat/qskinny)下载最新的源码,解压源码包后,进入源码目录,使用 Qt 的 qmake 和 make 工具进行编译和安装。然后在你要引入的项目的 .pro 文件中添加对 qskinny 库的引用。
简单展示如何在 QML 中使用 qskinny 控件创建一个包含按钮和文本框的界面:
import QtQuick 2.15
import Skinny 1.0ApplicationWindow {visible: truewidth: 640height: 480title: "qskinny Example"SkinnyItem {anchors.fill: parent// 创建一个按钮SkinnyPushButton {text: "Click me"anchors.centerIn: parentonClicked: {textField.text = "Button clicked!"}}// 创建一个文本框SkinnyLineEdit {id: textFieldanchors.top: parent.topanchors.left: parent.leftanchors.margins: 20width: 200}}
}
以上10个Qt相关的开关库,都是比较优秀的开源库。可以与 Qt 结合使用,以扩展其功能。