QT 数据库

2023-11-20

sqlite

SQLITE功能简约,小型化,追求最大磁盘效率,支持跨平台,不需要服务器,在本地的。

数据库操作基本的功能QT里面都有,可视化软件也很小。有支持关系模式的model。

In-memory database(IMDB),即内存数据库,是一种依赖于主存作为数据存储介质的一种数据库管理系统。相比传统的基于磁盘的数据库管理系统,IMDB速度快得多。

MYSQL

MySQL的安装与配置——详细教程 - Winton-H - 博客园为安装教程。

mysql配置比较麻烦,折腾了一天才配置好。第一个是不要用太高版本的mysql,用mysql8.0 是配置不了的,配置很多遍都配置不了。用mysql5.7.29一次就OK了。配置的方法参考【Qt】Qt5.12编译MySQl5.7驱动(亲自测试成功) - 沧海一笑_DJ - 博客园。第二个是mysql的位数要和QT编译器位数一致,编译器是32位的,mysql就是32位的,编译器是64位的,mysql必须是64位的。

MYSQL使用.bat一键安装

因为软件在部署的时候,往往都不是程序开发者本人去部署,所以需要使用一个便捷的方法,代替一个个cmd命令,使得他人在安装部署的时候简便快捷。参考此篇文章。Bat批处理命令实现一键安装mysql环境

数据库的迁移

使用HeidSQL可以直接把数据库迁移,使用SQL方式。至少在数据库数量小的时候特别有用。

注意事项

1.mysql只能连接创建好的数据库和使用已经创建好的表,目前没有找到打开数据库的时候创建的方法,然后创建的数据库在数据库安装的文件夹下面,不能移动。在打开数据后,还要执行"use +数据库名",才能执行sql语句。

不过可以使用一些技巧来处理,根据mysql的特性,先使用sys数据库进行连接,然后再根据需求创建数据库,后执行"use 数据库名",就可以执行一系列sql操作了。mysql的字符要用"";插入中文参考Incorrect string value: '\\xF0\\x9F\\x93\\x9E 1...' for column 'nickname' at row 1" 报错解决办法_weixin_42489971的博客-CSDN博客

2.mysql开启事务不能直接使用QT的函数transaction() commit(),而是使用query.exec("START TRANSACTION;")和query.exec("commit;")

3.Mysql的sql语句和sqlite的通用,数据类型可能有所不同,不过Mysql的默认编码不是utf8,所以会导致QT执行sql时执行不了(sql带中文的时候)。转码参考VS2013 Qt5 Mysql中文编码问题 - findumars - 博客园windows下Qt访问mysql中文名数据库_joyopirate的博客-CSDN博客

4.多线程使用MySQL,同时一个连接建立多个查询,参考以下两篇文章,目前其它方法都不行。

https://blog.csdn.net/qq_43445867/article/details/125665961

https://blog.csdn.net/qq_43445867/article/details/125665961

以下是QT数据库的类的用法

QSqlDatabase

    QSqlDatabase类表示到数据库的连接。QSqlDatabase类提供了通过连接访问数据库的接口。QSqlDatabase的一个实例表示连接。该连接通过受支持的数据库驱动程序之一提供对数据库的访问,该驱动程序派生自QSqlDriver。或者,您可以从QSqlDriver派生您自己的数据库驱动程序。有关更多信息,请参见如何编写自己的数据库驱动程序。创建一个连接(例如。通过调用一个静态addDatabase()函数,在该函数中指定要使用的驱动程序或驱动程序类型(即,你要访问什么样的数据库?)和一个连接名。一个连接通过它自己的名字而不是它所连接的数据库的名字被知道。可以有多个到一个数据库的连接。QSqlDatabase还支持默认连接的概念,即未命名连接。要创建默认连接,在调用addDatabase()时不要传递连接名参数。随后,当您调用任何接受连接名参数的静态成员函数时,如果没有传递连接名参数,则假定为默认连接。下面的代码片段展示了如何创建和打开到PostgreSQL数据库的默认连接。

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("acidalia");
    db.setDatabaseName("customdb");
    db.setUserName("mojito");
    db.setPassword("J0a1m8");
    bool ok = db.open();

QSqlQuery 

    QSqlQuery类提供了一种执行和操作SQL语句的方法。QSqlQuery封装了在QSqlDatabase上执行的SQL查询中创建、导航和检索数据所涉及的功能。它可以用来执行DML(数据操作语言)语句,比如SELECT、INSERT、UPDATE和DELETE,也可以用来执行DDL(数据定义语言)语句,比如CREATE TABLE。它还可以用来执行非标准SQL的特定于数据库的命令(例如,SET DATESTYLE=ISO for PostgreSQL)。

    成功执行的SQL语句将查询的状态设置为active,以便isActive()返回true。否则,查询的状态设置为inactive。在这两种情况下,当执行一个新的SQL语句时,查询被定位在一个无效的记录上。在检索值之前,必须将活动查询导航到有效的记录(以便isValid()返回true)。

     对于某些数据库,如果在调用commit()或rollback()时存在一个活动查询(即SELECT语句),则提交或回滚将失败。有关详细信息,请参见isActive()。

导航记录通过以下功能实现:
next() previous() first() last() seek()

     这些函数允许程序员向前、向后或任意地遍历查询返回的记录。如果只需要遍历结果(例如,通过使用next()),则可以使用setForwardOnly(),这将节省大量内存开销并提高某些数据库的性能。一旦活动查询定位在有效记录上,就可以使用value()检索数据。使用qvariant从SQL后端传输所有数据。

     要访问查询返回的数据,请使用value(int)。SELECT语句返回的数据中的每个字段都是通过传递该字段在语句中的位置(从0开始)来访问的。这使得使用SELECT *查询是不可取的,因为返回字段的顺序是不确定的。

     QSqlQuery支持预先准备的查询执行和将参数值绑定到占位符。有些数据库不支持这些特性,因此Qt模拟了所需的功能。例如,Oracle和ODBC驱动程序有适当的准备好的查询支持,Qt利用它;但是对于没有这种支持的数据库,Qt实现了特性本身,例如,在执行查询时用实际值替换占位符。使用numRowsAffected()查找非SELECT查询影响了多少行,使用size()查找SELECT检索了多少行。(这个特性用于插入、更新、删除很有用,避免写了一堆QString的SQL语句)占位符使用于插入、修改语句。

在创建QSqlQuery之前,必须加载SQL驱动程序并打开连接。此外,在查询存在时,连接必须保持打开状态;否则,QSqlQuery的行为是未定义的。

QSqlQuery不支持多个查询语句,使用多个select默认执行第一个。

QSqlRecord

封装了一条数据库记录。

QSqlRecord类封装了数据库记录的功能和特征(通常是数据库表或视图中的一行)。QSqlRecord支持添加和删除字段,以及设置和检索字段值。

QSqlQuery快速插入数据法

db.transaction();

query.prepare(...);   //只需要调用一次,调用多次就会慢

query.addBindValue(...);

db.commit();

//速度提升很多倍,使用QString直接插入比较耗时。

QSqlRelationalTableModel

QSqlRelationalTableModel类为单个数据库表提供了一个可编辑的数据模型,并且支持外键。使用构造函数时,不指定数据库连接,会自己使用默认的数据库连接,比如在内存中的数据库连接。fieldIndex()找到表中名字所在的属性列索引,setRelation()让指定的列成为由关系指定的外部索引

QSqlRelationalDelegate

QSqlRelationalDelegate类提供一个委托,用于显示和编辑来自QSqlRelationalTableModel的数据。可以定制化数据显示的方式(甚至可以画出来)和编辑方式(加QCombox等等)。

QDataWidgetMapper

QDataWidgetMapper类提供了数据模型部分到小部件之间的映射,可以将模型选中的数据映射到小部件来,随着模型选中的值改变和改变模型选中的值。

QSqlTableModel

QSqlTableModel类为单个数据库表提供了一个可编辑的数据模型。

使用构造函数时,不指定数据库连接,会自己使用默认的数据库连接,比如在内存中的数据库连接。QSqlTableModel是一个高级接口,用于从单个表读取和写入数据库记录。它构建在底层QSqlQuery之上,可以用来提供数据来查看类,比如QTableView。例如:   

QSqlTableModel *model = new QSqlTableModel(parentObject, database);
    model->setTable("employee");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

    QTableView *view = new QTableView;
    view->setModel(model);
    view->hideColumn(0); // don't show the ID
    view->show();

将模型操作所在的数据库表设置为tableName。不从表中选择数据,而是获取其字段信息。使用指定的筛选器和排序条件,使用通过setTable()设置的表中的数据填充模型,如果成功,则返回true;否则返回false。

QSqlQueryModel

QSqlQueryModel类为SQL结果集提供了一个只读数据模型。
QSqlQueryModel是一个高级接口,用于执行SQL语句和遍历结果集。它建立在较低级别的QSqlQuery之上,可以用来提供数据来查看类,比如QTableView。例如:

    QSqlQueryModel *model = new QSqlQueryModel;
    model->setQuery("SELECT name, salary FROM employee");
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();

QSqlQueryModel也可以通过编程方式访问数据库,而不需要绑定到视图:

默认情况下,模型是只读的。要使它具有读写能力,必须子类化它并重新实现setData()和flags()。另一个选项是使用QSqlTableModel,它提供了基于单个数据库表的读写模型。

TIP

1.除了英文,创建表的时候有数字和中文都要加单引号。

2.可在SQLite Expert 验证语句是否正确。

3.SQL语句中出现中文乱码,加上QString::fromLocal8Bit(s)即可,和普通字符串一样。

4.频繁插入数据,1000次程序都很耗时,所以要一次性插入数据。

5.表在数据库中已经创建,再创建一次,不会新建一个表,向里面插入数据也不会覆盖里面的数据,而是在表后面追加。数据库如果在路径下创建了的话,创建连接的时候同样不会去覆盖它。

关系模式

sqllite设置主键,但是在可视化工具并没有显示什么,表与表之间的联系主要通过两个表都有相同的属性列,常用ID。

关系模式的使用在关系操作上。

索引

加索引是一种提升查找速率的有效办法,存储空间加一些,但是速度提升几十倍。看需要加哪种索引。

注意:对于定义为TEXTIMAGE的数据不应该创建索引。这些字段长度不固定,或许很长,或许为空。操作符BETWEEN、LIKE、OR不能用索引。Text不能用“=”运算符。索引名称不同表相同都不行,索引必须都不相同。

主键

主键不是联合主键的话,每一个记录的主键的值必须不相同,插入时如果值存在的话,会插入失败。联合主键中的其中一个属性可以重复,但是联合主键的值组合起来必须不能重复。体现了主键的唯一性,能唯一标识此表的属性。

Ubuntu下的mysql

ibqsqlmysql.so文件复制到lib文件夹下即可。但是大概QT5.10之后就没这个文件了。自己apt install去安装,版本也是QT5.9的。

高版本的QT Mysql驱动需要自己编译。参照https://blog.csdn.net/annjeff/article/details/105798351Ubuntu安装mysql之后,编译找不到头文件 - 砚车干 - 博客园

常用语句

1.SELECT * FROM sqlite_master WHERE type='table';     获取数据库所有表。

QT的Demo

book 

图书示例展示了如何将Qt的SQL类与模型/视图框架一起使用,为存储在数据库中的信息创建丰富的用户界面。

这个案例用的是QSQLITE数据库,并且没有创建文件保存。tables()可以返回数据库中的包的名字。之后在表中创建有主键的表,sql语句为“create table books(id integer primary key, title varchar, author integer, genre integer, year integer, rating integer”,sql语句也可以用lastError()返回错误。

QSqlQuery调用prepare函数是为了准备执行一个SQL查询,有些数据库选择延迟准备查询,直到第一次执行它。在这种情况下,准备一个语法错误的查询会成功,但是每个连续的exec()都会失败。对于SQLite,查询字符串一次只能包含一条语句。如果给出了多个语句,则函数返回false。

下面的语句就是用了addBindValue插入数据,避免写了很长的QString。

QVariant addAuthor(QSqlQuery &q, const QString &name, const QDate &birthdate)
{
    q.addBindValue(name);
    q.addBindValue(birthdate);
    q.exec();
    return q.lastInsertId();
}

    if (!q.prepare(QLatin1String("insert into authors(name, birthdate) values(?, ?)")))
        return q.lastError();
    QVariant asimovId = addAuthor(q, QLatin1String("Isaac Asimov"), QDate(1920, 2, 1));
    QVariant greeneId = addAuthor(q, QLatin1String("Graham Greene"), QDate(1904, 10, 2));
    QVariant pratchettId = addAuthor(q, QLatin1String("Terry Pratchett"), QDate(1948, 4, 28));

"create table authors(id integer primary key, name varchar, birthdate date)"定义数据库的时候定义了id这个主键,每个数据库都定义。

这个例子建立了一个只在程序运行期间有效的数据库,但是这个数据库是一个全局的,在程序全局范围内均可用。

QCombox可以使用setModel设置模型,关联表的变量显示。

Cached Table Example

该示例包含一个类TableEditor,它是一个自定义对话框小部件,允许用户修改存储在数据库中的数据。

bool QSqlDatabase::commit()如果驱动程序支持事务并且已经启动了事务(),则将事务提交到数据库。如果操作成功,则返回true。否则返回false。

QSqlTableModel::revertAll()
恢复所有挂起的更改

Drill Down Example

这个例子涉及到动画的知识,只关注数据库知识即可。使用QSqlRelationalTableModel和QSqlRelation建立一个关系模式,然后QGraphicsScene根据这个模型添加图形项。InformationWindow这个窗口,使用QDataWidgetMapper关联窗口的控件,并支持回滚和提交功能。提交后,数据库的数据会改变,以及QGraphicsScene的图形项的图片会改变。

Master Detail Example

这个例子还用到XML的知识。XML是标准通用语言,可以考虑使用到一个软件的配置上。XML暂时不了解。

同样也是使用QSqlRelationalTableModel,建立关系,在albumView中显示。QSqlRecord类可以获取选中记录的信息,点击albumView的项,会在XML中查找相应的信息并在trackList中显示出来。这个例子的数据添加有点问题,等学习XML再看看。

querymodel

分别从直接使用的角度和继承的角度,介绍QSqlQueryModel的简单应用、可编辑应用,一般使用。直接应用只能显示不能修改,可编辑应用同时更新了数据库。一般使用可以定制化表格的一些显示。

relationaltablemodel

介绍QSqlRelationalTableModel的使用,使用该类建立关系模式,显示外键的值。

sqlbrowser

QMetaObject类包含关于Qt对象的元信息。这个类通常不是应用程序编程所需要的,但是如果您编写元应用程序(例如脚本引擎或GUI构建器),它就非常有用。如果连接为空,则 使用QMetaObject::invokeMethod,调用browser的addConnection函数。

只有QSQLITE支持在内存中创建数据库。

这个例子比较全面。

1.建立新数据库,会将起加入树形表里面,connectionWidget使用了类提升,提升可以将UI的控件用自己的类定义,比自定义控件方便。点击树形链表中相应的项的时候,表格会相应的显示选中表的数据,同时表格中的数据还可以右击进行添加、删除、回滚、提交等操作。sqlEdit的文本可作为sql语句,可以执行sql语句,并在状态栏显示错误、成功、以及受影响的记录数。还可以显示每一个属性列的一些属性。

2.这个例子除QSQLITE外其它属性列都连接不了,应该是环境变量没有响应的数据库的问题。暂时不管。

sqlwidgetmapper

这个例子讲如何使用小部件映射器和QComboBox小部件之间的命名映射,并使用一个特殊用途的模型将模型中的值与选项列表关联起来。使用QSqlRelationalTableModel建立关系模式。QDataWidgetMapper使用toPrevious()、toNext槽函数可以方便的切换。QComboBox还可以显示其它记录。

tablemodel

QSqlTableModel的简单使用范例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 数据库 的相关文章

  • Mysql Workbench 无法选择外键

    首先 我检查了很多问题并用谷歌搜索了很多 但没有一个解决我的问题 我正在使用 Mysql Workbench 6 3 创建表 我仅使用 gui 而不是单个查询来创建它们 之后我尝试创建一些外键int 11 列 但 GUI 不允许我这样做 这
  • 如何通过列名检查MySqlDataReader中的NULL?

    我怎样才能检查NULL开放的价值MySqlDataReader 以下不起作用 它总是击中else if rdr GetString timeOut null queryResult Egresstime Logged in else que
  • mysql 更新或插入多条记录(如果表中尚不存在)

    mysql 数据库中有一个名为 inventory item 的表 id product id 和 quantity 是表的列 id 是主键 在插入记录时自动生成 当用户提交要向表中插入多条记录的表单时 可以在 foreach 循环中收集所
  • 拥有两张单独的用户表还是一张更好?

    我的网络应用程序将拥有两种 100 不同的用户 领域 功能和网站目的 一类用户的目的是发布博客 另一类用户的目的是阅读博客并 关注 发布者 他们唯一的共同点是需要 ID 电子邮件 密码和其他一些元数据 例如加入日期等 我应该尝试将它们从同一
  • Laravel - 雄辩地覆盖自定义时间戳......为什么?

    我正在制作一个库存管理系统 当产品缺货时 我会在表中输入一个条目 并记下 oos at 字段和日期 时间 后来 当它回到库存时 我找到该条目并更新 restocked at 时间戳字段 但是 当我执行第二个操作时 我的 oos at 字段被
  • Qt + win32 + mingw 上的原生 Windows API 链接问题

    我正在尝试使用 mingw 工具集将本机 Windows API 与 Qt 结合使用 部分功能存在链接问题 会发生什么 这是 mingw 名称修改的错误吗 ifdef Q WS WIN HWND hwnd QWidget winId HDC
  • 如何连接flutter到localhost mysql数据库

    我想将本地主机 mysql 数据库连接到 flutter 但我没有这样做 我尝试了 mysql1 与这些连接 ConnectionSettings host 10 0 2 2 port 3306 user root password roo
  • 具有 TINYTEXT 列的 CREATE TABLE 语句中出现语法错误 1064?

    这是我到目前为止的 MySQL 代码 CREATE DATABASE bankbase USE bankbase CREATE TABLE clienttable ClientID SMALLINT 15 NOT NULL DEFAULT
  • 错误:从上游读取响应标头时上游过早关闭连接 [uWSGI/Django/NGINX]

    我目前在用户正在进行的查询中总是得到 502 它通常返回 872 行 在 MySQL 中运行需要 2 07 然而 它返回了大量信息 每一行包含很多东西 有任何想法吗 运行 Django tastypie Rest API Nginx 和 u
  • 检查目录是否为空

    我正在尝试检查目录是否为空 MainWindow MainWindow QWidget parent QMainWindow parent ui new Ui MainWindow ui gt setupUi this QDir Dir h
  • REACT NATIVE 从本地 MySQL 数据库检索数据

    我正在用 React Native 编写一个应用程序 并且创建了一个 MySQL 数据库来存储我的信息 但我想知道是否可以使用 axios 或 fetch 与我的数据库交互 因为它是本地的并且没有 HTTP 地址然而 我觉得我以前能够做到这
  • MySQL 不将 ı 视为 i?

    我在 MySQL 5 7 27 中有一个用户表utf8mb4 unicode ci整理 不幸的是 没有像 i 那样进行线程化 以下查询将找不到Y lmaz select id from users where name Yilmaz 我对其
  • mysql 如何比较 dd-mon-yy 格式的日期

    如何比较格式中的日期dd mon yy 例如 2014 年 11 月 10 日 gt 2013 年 10 月 7 日 select expiration date from grocery where expiration date lt
  • 为什么Mysql的Group By和Oracle的Group by行为不同

    为什么Mysql的Group By和Oracle的Group by行为不同 我多次发现 Mysql group By 功能和 Oracle 的 GroupBy 功能表现不同 很多时候我在Oracle中发现错误 这实际上是错误的查询 但是My
  • ERROR 188 (HY000): FTS 查询超出结果缓存限制 mysql

    我的表的文本列上有全文索引 约有 1100 万行 表结构 CREATE TABLE review id int 11 NOT NULL AUTO INCREMENT comments text COLLATE utf8mb4 unicode
  • QToolBar 的菜单延迟

    我通过制作 QAction 并向其添加 QMenu 在 QToolBar 上有一个菜单 如何消除单击图标时出现菜单之前的延迟 QToolBar myToolBar new QToolBar this QAction myAction new
  • 如何正确转义 mysql“搜索/喜欢”查询?

    Summary 我目前正在使用 search field LIKE this gt db gt escape like str search string 逃避动态创建的搜索查询 创建的 SQL 语句结果不会产生任何错误 也不会产生任何结果
  • 计算 MySQL 中每个唯一 ID 与前一行的日期差异

    我是一名 SQL 初学者 正在学习查询的诀窍 我正在尝试查找同一客户购买之间的日期差异 我有一个如下所示的数据集 ID Purchase Date 1 08 10 2017 1 08 11 2017 1 08 17 2017 2 08 09
  • 根据长文本存储的 json 中的特定值提取密钥

    我有一列存储用户属性的值 列类型是长文本 例如 1 1 15607 1 1345 2 我只想提取值为 1 的键 这意味着我应该得到 1 和 15607 我尝试使用 json search json search cast attribute
  • 如何恢复 QSS 属性的默认系统值?

    如果父级之一将其样式表设置为 Qt QSS 会传播给子级color red 它的所有子级都将应用此样式表 如果你明确设置QLabel color red 那么只有 QLabel 子项会受到关注 如果子项设置自己的值 则可以覆盖子项的样式表c

随机推荐

  • elasticsearch的object类型和动态映射

    我们需要讨论的最后一个自然JSON数据类型是对象 object 在其它语言中叫做hash hashmap dictionary 或者 associative array 内部对象 inner objects 经常用于在另一个对象中嵌入一个实
  • node mysql高级用法_nodejs中mysql用法

    1 建立数据库连接 createConnection Object 方法 该方法接受一个对象作为参数 该对象有四个常用的属性host user password database 与php中链接数据库的参数相同 属性列表如下 host 连接
  • Xray使用教程

    简介 Xray是长亭科技开发的一款漏扫工具 支持多种扫描方式和漏洞类型 可自定义POC Proof of Concept 概念验证 即漏洞验证程序 俺是在 乌雲安全 看到了这个工具的使用 作为一个脚本小子初学者 这里做一下笔记 使用 web
  • NVDLA系列之C-model:cvif<99>

    NV NVDLA cvif cpp WriteRequest sdp2cvif void NV NVDLA cvif WriteRequest sdp2cvif uint64 t base addr uint64 t first base
  • 通过递归,实现数组转树

    一 为什么需要数组转树 当我们做后台管理系统时难免会遇到关于公司组织架构这样的模块 一个部门下会有好几个小部门 这时我们就可以运用树形图来更好地进行查看 下面简单举例 将数组 const arr id 1 pid 0 name 生鲜 id
  • linux安装分区详解lvm,Linux下LVM的配置详解

    LVM是Logical Volume Manager 逻辑卷管理器 的简写 它为主机提供了更高层次的磁盘存储管理能力 LVM可以帮助系统管理员为应用与用户方便地分配存储空间 在LVM管理下的逻辑卷可以按需改变大小或添加移除 另外 LVM可以
  • 【正点原子探索者STM32F407开发板例程连载+教学】第30章 SPI通信实验

    第三十章 SPI 实验 mw shl code c true 1 硬件平台 正点原子探索者STM32F407开发板 2 软件平台 MDK5 1 3 固件库版本 V1 4 0 mw shl code 本章我们将向大家介绍STM32F4的SPI
  • upload-labs通关(Pass-06~Pass-10)

    目录 Pass 06 Pass 07 Pass 08 Pass 09 Pass 10 Pass 06 上传sh php失败 burp中将抓到的包send to repeater 修改filename为sh xxx发现可以上传成功 说明是黑名
  • 线上常见问题排查之CPU过高

    目前应用程序基本是Java 所以需要登录docker容器内部执行jstack命令打印堆栈信息再分析 确认目标进程 执行top命令查看CPU占用情况 找出CPU占用高的进程ID PS 输入大写P即可按照CPU占比排序进程 即 Shift p
  • BMP图像读取数据

    我们在使用Windows的画图软件 画一张图 然后保存成24位位图BMP图像后 要对这幅图像进行一系列的格式转换之前 需要先将BMP里的数据提取出来 然后再保存成BGR888的图像 有两处细节要注意 第一 我们直接保存成BMP图片 不知道为
  • [项目管理-25]:高效沟通的利器,结构思考力与树形结构化表达

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 结构化思考力概述 1 1 非结构化思考力的问题与结构化思路力的好处 1 2 什么是结构化思路力 1 3 三大沟通层次 层
  • vue prop属性使用方法小结

    Prop 一 基本用法 Prop的基本用法很简单 作用是在子组件中接收父组件的值 父组件传值
  • Allegro如何调整丝印字号

    1 设置颜色管理器 先将所有的都关掉 如果要调节top层丝印 打开top层的焊盘和阻焊层 绿油层 打开板框 丝印和位号 2 选择 设置字号 在Edit中执行Change命令 Find中选择Text 在Options中勾选刚才修改的2号字体
  • JSON首字母大写问题

    一般如果json中的字段和类里的属性相同 则不需要修改 如果不同则可以在类的属性上添加 JsonProperty 或者 JSONField 但是如果JSON数据或者类中属性首字母大写的话 只能使用 JsonProperty 否则注入的值是n
  • Spring学习笔记总结

    第一章 引言 1 EJB存在的问题 2 什么是Spring Spring是一个轻量级的JavaEE解决方案 整合众多优秀的设计模式 轻量级 1 对于运行环境是没有额外要求的 开源 tomcat resion jetty 收费 weblogi
  • 浅谈音视频开发入门基础及进阶资源分享

    导言 音视频开发涉及的知识面比较广 知识点又相对独立琐碎 入门门槛相对较高 想要对音视频开发具有深入全面的了解 需要在行业深耕多年 本文将简单介绍音视频的采集 编解码 传输 渲染四个技术点并对涉及到的知识点和原理进行解释 希望你可以对音视频
  • JAVA并发:线程安全与Synchorinzed

    1 什么是线程安全问题 线程的合理使用能够提升程序的处理性能 主要有两个方面 第一个是能够利用多核 cpu 以及超线程技术来实现线程的并行执行 第二个是线程的异步化执行相比于同步执行来说 异步执行能够很好的优化程序的处理性能提升并发吞吐量
  • 强符号与弱符号

    文章目录 强符号不允许多次定义 强弱可以共存 都是弱符号 简而言之 在 C 语言中 函数和初始化的全局变量 包括显示初始化为 0 是强符号 未初始化的全局变量是弱符号 在链接器进行链接的时候 有下面的规则 强符号不允许多次定义 即不同的目标
  • 多少个X 蓝桥杯模拟

    问题描述 给定一个字母矩阵 一个 X 图形由中心点和由中心点向四个45度斜线方向引出的直线段组成 四条 线段的长度相同 而且四条线段上的字母和中心点的字母相同 一个 X图形可以使用三个整数 r c L 来描述 其中 r c 表示中心点位于第
  • QT 数据库

    sqlite SQLITE功能简约 小型化 追求最大磁盘效率 支持跨平台 不需要服务器 在本地的 数据库操作基本的功能QT里面都有 可视化软件也很小 有支持关系模式的model In memory database IMDB 即内存数据库