Qt中使用MySQL数据库详解,好用的模块类封装
本文将详细介绍如何在Qt应用程序中集成MySQL数据库,并封装实现好用的mysql数据库操作类。包括环境准备、连接数据库、执行查询及异常处理等关键步骤,同时包含mysql驱动的编译。分享给有需要的小伙伴,喜欢的可以点击收藏。
目录
环境准备
项目配置
简单使用
简单示例
模块类封装
如何使用
附qsqlmysql库的构建
前提条件
构建步骤
1. 查找Qt的安装路径和编译器
2. 设置环境变量
3. 获取MySQL开发库
4. 构建 qsqlmysql 插件
Windows:
Linux:
5. 将编译好的插件拷贝到合适的位置
注意事项
其他资源
Qt提供了QtSql模块来进行独立于平台的数据库操作,这里的“平台”既包括操作系统平台,也包括各个数据库平台。Qt使用一个QDatabase表示一个数据库连接。在底层,Qt使用不同的驱动程序来与不同的数据库API进行交互。
通常Qt只默认搭载了QSqlLite驱动程序,如果需要使用其他数据库,需要下载相应的数据库驱动,如mysql的为 qsqlmysql.dll,同时还需要mysql的客户端库libmysql.dll。
在连接数据库之前可以使用QSqlDatabase::drivers()查看本机Qt已经支持的数据库驱动。
环境准备
1.安装MySQL数据库:首先确保你的系统中安装了MySQL服务器,并创建好数据库和表结构。
2.安装Qt开发环境:安装Qt Creator及Qt库,确保包含SQL驱动模块。
注意:Qt默认并不包括MySQL驱动,需要手动构建。在QT安装目录(如Qt5.12.11\5.12.11\msvc2015_64\plugins\sqldrivers)里找,是否有qsqlmysql.dll和qsqlmysqld.dll.
如果没有则需要基于QT源码从新构建,构建好后把qsqlmysql.dll放入plugins\sqldrivers目录中。如果不存在该库,则程序执行会报QSqlDatabase: QMYSQL driver not loaded的错误。
如果要构建QMYSQL,需安装Qt源代码,并确保你的系统中安装了MySQL服务器或至少安装了MySQL Connector/C++,因为构建过程需要MySQL的头文件和库文件。
可以通过以下方式查看支持哪些驱动:
qDebug()<<"support drivers:"<<QSqlDatabase::drivers();

3.安装MySQL的c/c++的Connector(MySQL客户端库):对于Qt 5.12及以上版本,MySQL驱动可能已内置,但若缺失,需下载MySQL Connector/C++并安装,确保Qt能找到libmysql动态库。(libmysql.dll动态库。链接:MySQL :: Download MySQL Connector/C (Archived Versions))

将压缩包解压,将lib文件夹下的libmysql.dll和libmysql.lib文件拷贝到Qt的安装目录的bin文件夹下即可。
项目配置
在你的Qt项目文件(.pro)中添加如下行以启用SQL模块:
QT += sql
简单使用
编写代码连接数据库:
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>void connectToDatabase() {QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setDatabaseName("testdb");db.setUserName("root");db.setPassword("password");if (!db.open()) {qDebug() << "Failed to connect to database:" << db.lastError().text();} else {qDebug() << "Connected to database!";}
}
简单示例
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>void connectToDatabase() {QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setDatabaseName("testdb");db.setUserName("root");db.setPassword("password");if (!db.open()) {qDebug() << "Failed to connect to database:" << db.lastError().text();} else {qDebug() << "Connected to database!";}
}bool createTable() {QSqlQuery query;bool success = query.exec("CREATE TABLE person (id INT PRIMARY KEY, name VARCHAR(40))");if (!success) {qDebug() << "Failed to create table:" << query.lastError().text();}return success;
}bool insertRecord(int id, const QString &name) {QSqlQuery query;query.prepare("INSERT INTO person (id, name) VALUES (:id, :name)");query.bindValue(":id", id);query.bindValue(":name", name);bool success = query.exec();if (!success) {qDebug() << "Failed to insert record:" << query.lastError().text();}return success;
}void queryRecords() {QSqlQuery query("SELECT id, name FROM person");while (query.next()) {int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << id << name;}
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);connectToDatabase();createTable();insertRecord(1, "Alice");insertRecord(2, "Bob");queryRecords();return a.exec();
}
模块类封装
直接使用不太好用,这里做一个模块类封装,变得更好用啦,接口变得简单清晰。如果不封装,则原始是使用大概如下:
QSqlQuery query(QSqlDatabase::database(connectionName, true));query.prepare("insert into test(name,age) values(:nameL,:ageL)");QStringList namelist;namelist<<"Tt"<<"Pp"<<"Kk";query.bindValue(":nameL",namelist);QVariantList agelist;agelist<<40<<50<<60;query.bindValue(":ageL",agelist);if(!query.execBatch()){qDebug()<<"数据插入失败: "<<query.lastError().text();}else{qDebug()<<"数据插入成功!";}
可以看到使用比较繁琐,封装后的模块代码如下:
#include "mysqldb.h"
#include <QDebug>
#include <QUuid>mysqlDb::mysqlDb() {qDebug()<<"support drivers:"<<QSqlDatabase::drivers();
}mysqlDb::~mysqlDb() {disConnectSql();
}//打开连接
bool mysqlDb::connectSql(const QString &dbName) {mdbName_= dbName;db = QSqlDatabase::database(connectionName);if(!db.isValid()) {QUuid qUuid = QUuid::createUuid();QString strUuid = qUuid.toString();connectionName = QString("mysql-%1").arg(strUuid);db = QSqlDatabase::addDatabase("QMYSQL",connectionName);db.setHostName(mhost_); //根据实际情况设置主机名db.setPort(mport_);db.setDatabaseName(dbName);db.setUserName(muser_); //根据实际情况设置用户名db.setPassword(mpwd_); //根据实际情况设置密码db.setConnectOptions("MYSQL_OPT_RECONNECT=1"); // 支持断线重连if (!db.open()) {qWarning("Failed to open database: %s", qPrintable(db.lastError().text()));return false;}}return true;
}
//打开连接
bool mysqlDb::connectSql(const QString &host, int port, const QString &dbName, const QString &userName, const QString &password) {mhost_= host;mport_= port;mdbName_= dbName;muser_= userName;mpwd_ = password;db = QSqlDatabase::database(connectionName);if(!db.isValid()) {QUuid qUuid = QUuid::createUuid();QString strUuid = qUuid.toString();connectionName = QString("mysql-%1").arg(strUuid);db = QSqlDatabase::addDatabase("QMYSQL",connectionName);db.setHostName(host); //根据实际情况设置主机名db.setPort(port);db.setDatabaseName(dbName);db.setUserName(userName); //根据实际情况设置用户名db.setPassword(password); //根据实际情况设置密码db.setConnectOptions("MYSQL_OPT_RECONNECT=1"); // 支持断线重连if (!db.open()) {qWarning("Failed to open database: %s", qPrintable(db.lastError().text()));return false;}}return true;
}//关闭连接
bool mysqlDb::disConnectSql() {db = QSqlDatabase::database(connectionName);if(!db.isValid()) {return true;}db.close();QSqlDatabase::removeDatabase(connectionName);connectionName = "";return true;
}//错误打印
void mysqlDb::errorSql(QString sql) {errorSqlText = sql;qCritical("%s", qPrintable(errorSqlText));
}//获取错误的数据库语句
QString mysqlDb::getErrorSql() {if(connectionName.isEmpty()) {return "db not setting";}return errorSqlText;
}void mysqlDb::setMdbName(const QString &mdbName)
{mdbName_ = mdbName;
}void mysqlDb::setMpwd(const QString &mpwd)
{mpwd_ = mpwd;
}void mysqlDb::setMuser(const QString &muser)
{muser_ = muser;
}void mysqlDb::setMhost(const QString &mhost)
{mhost_ = mhost;
}void mysqlDb::setMport(int mport)
{mport_ = mport;
}//执行sql语句,不获取结果
bool mysqlDb::queryExec( QString queryStr) {if(connectionName.isEmpty()) {if(!connectSql(mhost_,mport_,mdbName_,muser_,mpwd_)) {return false;}}QSqlQuery query(QSqlDatabase::database(connectionName, true));if(!query.exec(queryStr)) {errorSql(queryStr);return false;}return true;
}//执行sql语句,并获取结果
bool mysqlDb::queryExec( QString queryStr, QList<QHash<QString, QString>> &data) {data.clear();if(connectionName.isEmpty()) {if(!connectSql(mhost_,mport_,mdbName_,muser_,mpwd_)) {return false;}}QSqlQuery query(QSqlDatabase::database(connectionName, true));if(!query.exec(queryStr)) {errorSql(queryStr);return false;}QSqlRecord rec = query.record();while(query.next()) {QHash<QString, QString> rowData;for(int i = 0; i < rec.count(); i++) {QVariant::Type ty = query.value(i).type();if(QVariant::Type::Date == ty) {QDate temp = query.value(i).toDate();rowData[rec.fieldName(i)] = temp.toString("yyyy-MM-dd");} else if(QVariant::Type::Time == ty) {QTime temp = query.value(i).toTime();rowData[rec.fieldName(i)] = temp.toString("hh:mm:ss");} else if(QVariant::Type::DateTime == ty) {QDateTime temp = query.value(i).toDateTime();rowData[rec.fieldName(i)] = temp.toString("yyyy-MM-dd hh:mm:ss");} else {rowData[rec.fieldName(i)] = query.value(i).toString();}}data.append(rowData);}return true;
}//获取数据
bool mysqlDb::getData(QString tableName, QHash<QString, QString> &data, QString sqlWhere) {data.clear();QList<QHash<QString, QString>> dataList;if(!getData(tableName, dataList, sqlWhere)) {return false;}if(dataList.count() > 0) {data = dataList[0];}return true;
}//获取数据
bool mysqlDb::getData( QString tableName, QList<QHash<QString, QString>> &data, QString sqlWhere) {QString queryStr = "select * from " + tableName;if(!sqlWhere.isEmpty()) {queryStr += " " + sqlWhere;}return queryExec(queryStr, data);
}//获取数据
bool mysqlDb::getData(QString tableName, QHash<QString, QString> columndata, QList<QHash<QString, QString>> &data, QString sqlWhere) {QString colunmStr;if(columndata.count() == 0) {colunmStr = "*";} else {QStringList keys = columndata.keys();for(auto key : keys) {QString column = QString("%1 AS %2").arg(key).arg(columndata[key]);if(!colunmStr.isEmpty()) {colunmStr += ",";}colunmStr += column;}}QString queryStr = QString("SELECT %1 FROM %2 %3").arg(colunmStr).arg(tableName).arg(sqlWhere);return queryExec(queryStr, data);
}//增加
bool mysqlDb::addData(QString tableName, QHash<QString, QString> data) {if(data.isEmpty()) {return false;}QString queryStr = "INSERT INTO " + tableName + " ";QString fieldStr = "(", valueStr = "VALUES(";QHash<QString, QString>::iterator it;for(it = data.begin(); it != data.end(); ++it) {fieldStr += it.key() + ",";valueStr += "'" + it.value() + "',";}fieldStr = fieldStr.left(fieldStr.length() - 1);valueStr = valueStr.left(valueStr.length() - 1);fieldStr += ")";valueStr += ")";queryStr += fieldStr + " " + valueStr;return queryExec(queryStr);
}//删除
bool mysqlDb::delData(QString tableName, QString sqlWhere) {QString queryStr = "DELETE FROM " + tableName;if(!sqlWhere.isEmpty()) {queryStr += " " + sqlWhere;}return queryExec(queryStr);
}//修改
bool mysqlDb::updateData( QString tableName, QHash<QString, QString> data, QString sqlWhere) {QString queryStr = "UPDATE " + tableName + " ";QHash<QString, QString>::iterator it;QString setStr = "SET ";for(it = data.begin(); it != data.end(); ++it) {setStr += it.key() + "='" + it.value() + "'";setStr += ",";}setStr = setStr.left(setStr.length() - 1);queryStr += setStr;if(!sqlWhere.isEmpty()) {queryStr += " " + sqlWhere;}return queryExec(queryStr);
}bool mysqlDb::transaction() {if(connectionName.isEmpty()) {return false;}return db.transaction();
}bool mysqlDb::commit() {if(connectionName.isEmpty()) {return false;}return db.commit();
}
#ifndef MYSQLDB_H
#define MYSQLDB_H#include <QDir>
#include <QDate>
#include <QDateTime>
#include <QFileInfo>
#include <QString>
#include <QTime>
#include <QSqlDatabase>
#include <QSqlRecord>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>class mysqlDb
{
public:mysqlDb();~mysqlDb();
public:bool connectSql(const QString &dbName);//打开连接bool connectSql(const QString &host, int port, const QString &dbName, const QString &userName, const QString &password);//打开连接bool disConnectSql();//关闭连接bool queryExec(QString sqlStr);//执行sql语句,不获取结果bool queryExec(QString sqlStr,QList<QHash<QString,QString>> &data);//执行sql语句,并获取结果bool getData(QString tableName,QHash<QString,QString> &data,QString sqlWhere=""); //获取数据bool getData(QString table,QList<QHash<QString,QString>> &data,QString sqlWhere=""); //获取数据bool getData(QString tableName,QHash<QString,QString> columndata,QList<QHash<QString,QString>> &data,QString sqlWhere=""); //获取数据bool addData(QString tableName,QHash<QString,QString> data);//增加bool delData(QString tableName,QString sqlWhere);//删除bool updateData(QString tableName,QHash<QString,QString> data,QString sqlWhere="");//修改bool transaction();bool commit();QString getErrorSql();//获取错误的数据库语句void setMhost(const QString &mhost);void setMport(int mport);void setMdbName(const QString &mdbName);void setMuser(const QString &muser);void setMpwd(const QString &mpwd);private:QSqlDatabase db;QString connectionName="";QString errorSqlText;//错误语句QString mdbName_="";QString mhost_ = "localhost";int mport_ = 3306;QString muser_="";QString mpwd_="";private:void errorSql(QString sql);//错误打印
};#endif // MYSQLDB_H
如何使用
void MainWindow::on_btn_test_clicked()
{mysqlDb* db = new mysqlDb();db->setMhost("111.178.126.10");db->setMuser("xxxxxx");db->setMpwd("xxxxxx");bool ret = db->openSql("test");if(ret){qDebug("connect ok");//插入数据QHash<QString, QString> user;user.insert("name","yang");user.insert("age","30");ret = db->addData("user",user);if(ret){qDebug("insert ok");}else{qDebug("insert error");}//读取数据QList<QHash<QString, QString>> data;ret = db->getData("user",data,"");if(ret){qDebug("get ok");for(auto d:data){qDebug(d["user"].toStdString().c_str());qDebug(d["age"].toStdString().c_str());}}else{qDebug("get error");}//更新QHash<QString, QString> update;update.insert("age","35");ret = db->updateData("user",update,"where age = 30");if(ret){qDebug("updateData ok");}else{qDebug("updateData error");}//删除ret = db->delData("user","where age = 32");if(ret){qDebug("delete ok");}else{qDebug("delete error");}}else{qDebug("connect error");}
}
附qsqlmysql库的构建
如果已经有该库,以下步骤可忽略。该库位置在Qt5.xx\5.xx\msvc20xx_\plugins\sqldrivers
qsqlmysql库是Qt框架中用于连接MySQL数据库的一个插件库。它是Qt SQL模块的一部分,专门设计用于提供对MySQL数据库的支持。
前提条件
- 安装Qt:确保你已经安装了Qt和Qt Creator。
- 安装MySQL客户端库:
- Windows环境下,可以直接下载 MySQL C API 开发包 (MySQL Connector/C)。
- Linux环境,可通过包管理器安装(例如
sudo apt-get install libmysqlclient-dev)。 - macOS环境,可通过Homebrew安装(例如
brew install mysql-client)。
- 下载QT相应版本的源码,比如我的是Qt5.14.2。下载地址:https://download.qt.io/
构建步骤
1. 查找Qt的安装路径和编译器
- 确认你的Qt安装路径。例如:
C:\Qt\5.x.x\mingwxx_32 - 确认你使用的编译器,如
MinGW或MSVC,以及其路径。 - QT的源码不用全解压,只需要qtbase这个文件夹下的全部内容。
2. 设置环境变量
- 将Qt的编译工具(如
qmake)添加到系统的PATH变量中。
3. 获取MySQL开发库
- 确保你已经下载并解压了 MySQL Connector/C 用于 Windows 系统;在Linux和macOS系统上安装相应的开发库会自动设置好的路径。
4. 构建 qsqlmysql 插件
使用Qtcreator打开D:\Qt\qtbase\src\plugins\sqldrivers\mysql\mysql.pro工程文件。

打开工程后,会报错:Cannot read qtsqldrivers-config.pri: No such file or directory
接下来需要对mysql.pro文件和它上一级的qsqldriverbase.pri文件做出修改:
修改qsqldriverbase.pri
QT = core core-private sql-private# For QMAKE_USE in the parent projects.
#注释到这个
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
#新增加这个
include(./configure.pri)PLUGIN_TYPE = sqldrivers
load(qt_plugin)DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
修改 mysql.pro:

TARGET = qsqlmysqlHEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp#注释到这个
#QMAKE_USE += mysqlOTHER_FILES += mysql.jsonPLUGIN_CLASS_NAME = QMYSQLDriverPlugin
#以下为新增
#!!mysql的lib路径
LIBS += D:\Qt\mysql-connector-c-6.1.11-winx64/lib/libmysql.lib
#!!mysql的include路径
INCLUDEPATH += $$quote(D:\Qt\mysql-connector-c-6.1.11-winx64/include)
#!!mysql的include路径
DEPENDPATH += $$quote(D:\Qt\mysql-connector-c-6.1.11-winx64/include)include(../qsqldriverbase.pri)#!!设置编译好的qmysql.dll放置的目录
DESTDIR = ../mysql/mysqlDll
5. 将编译好的插件拷贝到合适的位置
- 将编译得到的
qsqlmysql.dll(或libqsqlmysql.so或libqsqlmysql.dylib)放到Qt的插件目录下。例如C:\Qt\5.x.x\mingwxx_64\plugins\sqldrivers(Windows)或/path/to/qt/plugins/sqldrivers(Linux和macOS)。
注意事项
- 版本匹配:请确保你的 MySQL 客户端库版本与 MySQL 服务器版本兼容,同时确保与 Qt 使用的编译器版本一致。
- 路径问题:在运行示例程序时,所有路径要使用绝对路径或将相关路径加入到环境变量中以确保 Qt 能够找到相应的库文件。
- 权限问题:在Linux和macOS环境下,可能需要使用
sudo来执行某些命令以拥有足够的权限。
按照上述步骤,你应该能够成功构建并使用 qsqlmysql 插件来连接 MySQL 数据库。
最后,附上编译好的mysql驱动,含windows和mac版本的(5.14.2,5.15.2,6.5.3)
链接如下:
https://pan.baidu.com/s/1m15DbFuFTtXfEyqyOS2cew
提取码: 2o2s
其他资源
https://www.cnblogs.com/zhuchunlin/p/16485933.html
QT连接MYSQL(保姆级成功案例)_qt mysql-CSDN博客
QT学习之路——Qt QMySQL driver not loaded问题(笔记)_qsqldatabase: qmysql driver not loaded qsqldatabas-CSDN博客
MySQL :: Download MySQL Connector/C (Archived Versions)
QT加载mysql失败,重新构建mysql源文件_qt重新加载资源文件-CSDN博客
QT操作Mysql数据库_qt mysql-CSDN博客
https://www.cnblogs.com/flygreen/p/18029637
Qt连接mysql数据库_不能找到qtsqldrivers-config.pri-CSDN博客
Linux下Qt 5.15.2源码下载及编译_qt5 linux 源码下载-CSDN博客
qt creator mysql_qt creator with mysql-CSDN博客
编译qt5.15.2(mac/windows)的mysql驱动(附带编译好的文件)_macos编译qt5.15.2-CSDN博客
相关文章:
Qt中使用MySQL数据库详解,好用的模块类封装
本文将详细介绍如何在Qt应用程序中集成MySQL数据库,并封装实现好用的mysql数据库操作类。包括环境准备、连接数据库、执行查询及异常处理等关键步骤,同时包含mysql驱动的编译。分享给有需要的小伙伴,喜欢的可以点击收藏。 目录 环境准备 项…...
C语言实现 人生重生模拟器游戏
目录 实现一个简化版的人生重开模拟器 1.菜单函数 2.game函数 3.幼年时期(even函数) 4.壮年时期(Juvenile函数) 课余时间实现的小游戏 实现一个简化版的人生重开模拟器 1.菜单函数 void menu() {printf("---------------…...
C语言两个较大数字相加
C语言两个较大数字相加 思路分析 由于C语言中的基本数据类型(如int、long等)有固定的大小,无法直接处理非常大的数字(如数百位的数字)。因此,我们需要采用字符串或数组来表示大数字,并逐位进行…...
大数据面试题之Flume
目录 介绍下Flume Flume架构 Flume有哪些Source 说下Flume事务机制 介绍下Flume采集数据的原理?底层实现? Flume如何保证数据的可靠性 Flume传输数据时如何保证数据一致性(可靠性) Flume拦截器 如何监控消费型Flu…...
js文件的执行和变量初始化缓存
js文件和变量初始化 全局变量举例js文件加载 全局变量举例 import * as turf from "turf/turf"; import earcut from "earcut"; import * as THREE from "three"; import { TextGeometry } from "three/addons/geometries/TextGeometry.js…...
无法定位程序输入点Z9 qt assertPKcS0i于动态链接库F:\code\projects\06_algorithm\main.exe
解决方法: 这个报错,是因为程序在运行时没要找到所需的dll库,如果把这个程序方法中对应库的目录下执行,则可正常执行。即使将图中mingw_64\bin 环境变量上移到msvc2022_64\bin 之前也不可以。 最终的解决方法是在makefile中设置环…...
GoLand 2024 for Mac GO语言集成开发工具环境
Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…...
Protocol Buffer 基础(c++)
本教程提供了使用协议缓冲区的基本介绍。通过逐步创建一个简单的示例应用程序,介绍以下内容: 1.在.proto文件中定义消息格式。 2.使用 protocol buffer 编译器。 3.使用c protocol buffer API来写入和读取消息。 一、问题描述 将要使用的示例是…...
上位机网络通讯
目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 上位机网络通讯 {public partial class Form1 : Form{public Form1(){Initializ…...
转让5000万无区域能源公司要求和流程
国家局的公司,也就是无地域无区域性的公司名称。这样的公司是还可以继续注册的,但是想要拥有国家局无区域的名称就不是那么容易的了。总局的企业要求高,也是实力的体现。对字号有保护。所以有很多人都对无地域的名称一直情有独钟。现有一家名…...
WordPress Quiz Maker插件 SQL注入漏洞复现(CVE-2024-6028)
0x01 产品简介 WordPress Quiz Maker插件是一款功能强大的测验生成工具,旨在帮助用户轻松、快速地构建复杂的测验和考试。插件支持多种问题类型,包括单选框(MCQ)、复选框(MCQ)、下拉列表(MCQ)、文本、短文本、数字、日期等。还支持横幅(HTML)显示信息性消息、填空题…...
Swift中的二分查找:全面指南
Swift中的二分查找:全面指南 简介 二分查找是计算机科学中的经典算法,被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同,二分查找不断将搜索区间减半,因此在处理大数据集时要快得多。 在这篇博客中…...
BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’
TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…...
解析Kotlin中的Lambda【笔记摘要】
先看实例: fun b(param: Int): String {return param.toString() }fun a(funParam: (Int) -> String): String {return funParam(1) }a(::b) val d ::b1.双冒号 ::method 到底是什么?答:一个指向和该函数具有相同功能的对象的引用 因为…...
rust单元测试顺序执行
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 存在的问题 有时候,不同单元测试之间可能会竞争相同的资源,比如读写相同的文件。在这种情况下,如果…...
力扣-744. 寻找比目标字母大的最小字母
文章目录 力扣题目代码工程 力扣题目 给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个…...
一篇文章搞懂弹性云服务器和轻量云服务器的区别
前言 在众多的云服务器类型中,弹性云服务器和轻量云服务器因其各自的特点和优势,受到了广大用户的青睐。那么,这两者之间到底有哪些区别呢?本文将为您详细解析。 弹性云服务器:灵活多变的计算资源池 弹性云服务器&…...
横穿自动驾驶
如果有一条线,可以穿起来所有自动驾驶的核心模块,那么我感觉它就是最优化,选择优化变量、构造优化问题、求解优化问题,这几个步骤贯穿了自动驾驶的始终。 先从我的自身接触顺序写起。最开始做个一点深度学习,那还是20…...
为什么网上商店需要翻译成其他语言
网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台,为来自世界各地的用户提供购买所需物品的机会。但是,为了让这些用户舒适地使用网站,需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…...
【高考志愿】交通运输工程
目录 一、专业概述 二、课程设置 三、就业前景 四、报考注意 五、未来发展 六、交通运输工程专业排名 高考志愿选择交通运输工程专业,无疑是一个既具远见又富有挑战性的决定。这个专业以其综合性强、实用性高的特点,吸引了大批有志于投身交通事业的…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
