您的位置:首页 > 汽车 > 新车 > 百度爱采购_app外包网_哪个搜索引擎最好用_快速seo软件

百度爱采购_app外包网_哪个搜索引擎最好用_快速seo软件

2024/10/20 5:40:51 来源:https://blog.csdn.net/qq_43920838/article/details/142954401  浏览:    关键词:百度爱采购_app外包网_哪个搜索引擎最好用_快速seo软件
百度爱采购_app外包网_哪个搜索引擎最好用_快速seo软件

目录

  • 出售车辆在前后端的主要流程?
    • 如何创建数据库表?
      • 如何在QT中连接数据库
        • 为什么这个数据库表在头文件中创建?
        • 为什么使用静态布尔函数?
        • 能不设置以下这些名字吗?
    • QSqlQuery对象
      • 如何写SQL的增删改查语句
        • 为什么这边外面有QString?
        • factory和brand两个表如何关联起来?
  • 数据库表创建好了,下一步如何使用这个数据库表?
    • 在main.cpp中if(!createConnection()||!createXml())return 0;这样写代码的好处是
    • 如何显示数据库表?
      • 如何将创建好的query对象等放到前端中,并能够与某个控件相关联?
      • 用什么函数进行关联
        • 为什么创建这个对象的时候用*?
        • 那在这段语句中factoryModel->setQuery("SELECT name FROM factory");factoryModel是指针还是别的?
      • QSqlQueryModel
  • 工具箱
    • 调整布局
      • QT的布局调整还有哪些方式?
      • 布局的逻辑是咋样的?
        • 如何设置布局?
          • 如何设置布局大小?
          • qsplitter对象加载在哪一个控件中?
          • 如何调整布局在整个页面中的位置?
          • 如果原先是随意排列的ui控件,再执行一次这个语句中,会改变ui的底层代码吗?

出售车辆在前后端的主要流程?

(前端上是一个出售的button,对应着点击之后,槽函数中操作xml文件增加销售记录
在头文件中声明该Button的指针
在源文件中创建该button对象,并编写槽函数

创建数据库表,厂家表factory和品牌表brand)
一开始不需要信号与槽机制,只需要将数据库结果读取到专门的对象中,然后将这个数据只读模型的结果加载到对应的视图中,比如下拉框
所以流程就是,创建数据库表,查询数据库表
然后这些各种查询的功能在界面上放在哪里呢?都放到工具箱当中

如何创建数据库表?

首先要连接数据库吧
在这里插入图片描述
这行代码的作用是使用 Qt 框架中的 QSqlDatabase 类创建一个 SQLite 数据库连接。让我们详细解释这行代码的各个部分:

  1. QSqlDatabase 类:
  • QSqlDatabase 是 Qt 提供的用于管理数据库连接的类,它支持多种数据库类型,如 SQLite、MySQL、PostgreSQL 等。通过它可以执行数据库的连接、断开连接、管理事务、以及执行 SQL 查询等操作。
  1. addDatabase("QSQLITE") 函数:
  • QSqlDatabase::addDatabase() 是一个静态函数,用来创建一个新的数据库连接。它接受一个参数,即数据库驱动类型的字符串。
  • "QSQLITE" 表示使用的是 SQLite 数据库驱动。SQLite 是一种轻量级的嵌入式数据库,适合用于本地应用程序,它不需要额外的数据库服务器。
  1. 静态方法 addDatabase()
  • 静态方法:这意味着你不需要先实例化 QSqlDatabase 对象就可以调用这个方法。它会在 Qt 数据库管理系统中注册并返回一个 QSqlDatabase 对象,供后续操作使用。
  • 如果你要使用其他数据库(如 MySQL、PostgreSQL),只需将 "QSQLITE" 替换为相应的驱动名称(如 "QMYSQL""QPSQL")。
  1. db 对象:
  • QSqlDatabase db 是一个数据库连接对象,通过 addDatabase() 函数创建。这个对象后续可以用来配置、打开、关闭数据库,执行 SQL 语句等操作。

示例代码的完整步骤:

  1. 创建数据库连接:这行代码创建了一个 SQLite 数据库连接,但数据库还没有被打开。
  2. 设置数据库名称:你可以使用 db.setDatabaseName() 设置 SQLite 数据库文件名。
  3. 打开数据库:使用 db.open() 打开数据库,只有打开成功后,才能对数据库执行查询和其他操作。

总结:

  • QSqlDatabase::addDatabase("QSQLITE"):用于添加一个 SQLite 数据库连接。
  • db.setDatabaseName():用于设置数据库文件名。
  • db.open():用于打开数据库连接,连接成功后可执行 SQL 操作。

如何在QT中连接数据库

首先项目文件中添加数据库模块,qt+=sql xml
然后用一个变量来连接这个表

然后在使用query.exec(create factory )
在这里插入图片描述

为什么这个数据库表在头文件中创建?

放在头文件中定义数据库连接对象和初始化代码的原因通常是为了将数据库连接作为类的成员或在类中进行全局初始化,这样可以确保:

在整个程序中只创建一个数据库连接,避免重复连接数据库。
方便在程序其他部分(如槽函数、成员函数等)访问数据库对象 db 和执行查询。
确保数据库连接的生命周期和类的生命周期一致。
使用场景:
数据库初始化:这种初始化方式适用于应用程序启动时需要连接数据库,并在整个应用程序生命周期中都需要进行数据库操作的场景。比如,构建 GUI 应用程序时,用户可以通过界面与数据库进行交互(如查看、修改数据),这些操作都需要数据库连接保持打开状态。

全局访问数据库:在头文件中定义数据库连接,可以确保在程序的任何部分(类的成员函数或槽函数)都能够访问该连接,而不必每次操作数据库时重新创建连接。

为什么使用静态布尔函数?

在这里插入图片描述

  1. 为什么使用静态函数 (static):
    静态函数的作用:static 关键字使函数成为类级别的函数,意味着它不依赖于任何特定对象的实例,而是与类本身关联。
    目的:静态函数可以在没有创建类对象的情况下调用。这在初始化和配置全局资源(如数据库连接)时非常有用,因为数据库连接通常是全局的,不需要每个对象实例都有自己的连接。
    全局性:在整个程序中,只需调用一次静态函数来创建数据库连接,该连接可以被所有调用的函数或模块共享。
    举例:
    如果你的应用程序有多个窗口或模块都需要访问数据库,使用静态函数来创建和管理数据库连接,可以避免重复创建连接。只要连接已经创建并成功打开,后续模块可以直接使用现有的连接。
  2. 返回 bool 的原因:
    返回值表示操作成功或失败:布尔返回值(bool)是用来告诉调用者数据库连接是否成功打开的。如果连接成功,返回 true;如果连接失败(例如数据库路径错误或权限问题),返回 false。
    错误处理:这种设计允许调用方检查连接是否成功,并在连接失败时执行适当的错误处理逻辑。例如,如果连接失败,应用程序可以给用户提示或者终止相关功能。
能不设置以下这些名字吗?

在这里插入图片描述
对于 SQLite 数据库而言,以下这些设置通常是不必要的,因为 SQLite 是一种本地嵌入式数据库,不依赖网络连接、用户名或密码等信息来访问。让我们逐项分析这些设置是否需要:

  1. db.setHostName("easybook-3313b0");
  • 是否需要:不需要。
  • 原因:SQLite 是嵌入式数据库,不涉及服务器连接。setHostName() 用于网络数据库(如 MySQL、PostgreSQL)来指定数据库服务器的主机名或 IP 地址,而在 SQLite 中没有意义。
  1. db.setDatabaseName("data.db");
  • 是否需要需要
  • 原因:虽然不需要设置主机名、用户名或密码,但必须设置 数据库文件的路径。这行代码告诉 SQLite 使用哪个文件来存储或读取数据。如果该文件不存在,SQLite 会自动创建它。该设置对于 SQLite 至关重要。
  1. db.setUserName("zhouhejun");db.setPassword("123456");
  • 是否需要:不需要。
  • 原因:SQLite 没有用户管理功能,它是一个文件系统级别的数据库,不需要通过用户名或密码来控制访问。通常,文件权限由操作系统的文件系统管理,而不是数据库本身。

最小化的 SQLite 连接代码示例:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("data.db");  // 这是唯一需要设置的if (!db.open()) {qDebug() << "Error: Could not open database.";
} else {qDebug() << "Database opened successfully.";
}

总结:

  • 对于 SQLite,setHostName()setUserName()setPassword() 是不需要的,因为 SQLite 不涉及远程连接或用户权限验证。
  • 唯一必需的设置是 setDatabaseName(),用于指定数据库文件的路径。

然后需要设置一个QSqlQuery对象

QSqlQuery对象

在这里插入图片描述
QSqlQuery 是 Qt 框架中的一个类,用于执行和操作 SQL 语句。它允许你在数据库上执行查询、插入、更新和删除操作,并处理结果集。

当你声明一个 QSqlQuery query; 对象时,它的用途是为了执行 SQL 查询语句并处理查询结果。这个对象需要与一个已经打开的 QSqlDatabase 连接关联,才能执行 SQL 操作。

QSqlQuery 的作用:
执行 SQL 语句:

QSqlQuery 可以执行各类 SQL 语句,比如 SELECT、INSERT、UPDATE 和 DELETE。执行后,QSqlQuery 对象会存储查询结果,供后续处理。
遍历查询结果:

对于 SELECT 查询,QSqlQuery 会返回一个结果集,你可以使用 next() 函数遍历每一行结果。
处理参数化查询:

它支持参数化查询,能够有效避免 SQL 注入风险。

如何写SQL的增删改查语句

query.exec("create table factory ")
先要创建一个表
在这里插入图片描述 字段定义:
表中的字段有两个:id 和 name。

varchar代表存储可变长度的字符串,primary key表示主键

然后在表中添加工厂
query.exec(“insert ‘一汽大众’ into factory id”)
在这里插入图片描述
“insert into factory values(‘id’,‘name’)”

为什么这边外面有QString?

使用 QString 构造 SQL 语句的原因是:这些插入语句可能涉及中文字符(例如 “一汽大众”),使用 QString 可以确保正确处理这些多字节字符(例如中文),并且避免字符编码问题。
另外,如果在实际项目中插入数据需要动态生成(例如插入的值是由用户输入或从程序中动态生成),QString 可以通过拼接或格式化来灵活构建 SQL 语句。

下面是创建品牌表,
query.exec(“create table brand (brand varchar, name varchar foreign key )”)
在这里插入图片描述
一般来说,id都是主键
id varchar primary key
name varchar
factory varchar
price int
sum int
sell int
last int
在这里插入图片描述

factory和brand两个表如何关联起来?

数据库表创建好了,下一步如何使用这个数据库表?

(显示数据库表,如何去显示?
头文件需要关联到main函数并运行这个数据库静态函数以全局方式创建数据库表

在main.cpp中包含这个头文件,注意自己新建的头文件(只要不是QT自带的)都需要用“”,自带的用<>。
(显示就是查询,显示所有就是查询所有。所以数据库表创建完成后的第一步就是如何去查询这个数据库结果)
在这里插入图片描述
在这里插入图片描述

在main.cpp中if(!createConnection()||!createXml())return 0;这样写代码的好处是

在 main.cpp 中写 if (!createConnection() || !createXml()) return 0; 这样的代码逻辑有几个明显的好处。这个结构的作用是依次执行两个初始化操作,确保数据库连接和 XML 文件的正确初始化,如果任何一个步骤失败,程序就会终止。
这种写法的好处在于简洁、可读、有效地处理程序的初始化失败情况,确保必要的初始化步骤完成后才继续运行程序。
短路求值减少了不必要的操作,使得代码效率更高,避免了不必要的资源消耗。
同时也提高了程序的健壮性,防止初始化失败后执行无效操作,可能导致不可预料的错误。

如何显示数据库表?

在这里插入图片描述
主要用了QSqlQueryModel,这个类用于显示和处理数据库结果

如何将创建好的query对象等放到前端中,并能够与某个控件相关联?

使用对象来执行查询数据库表的语句
在这里插入图片描述
然后再与ui中的下拉框关联,来查询factory表中的所有名称
在这里插入图片描述

用什么函数进行关联

setQuery和setModel
setQuery() 是 QSqlQueryModel 类中的一个函数,用于执行 SQL 查询并将结果加载到模型中。在 Qt 中,QSqlQueryModel 是一个只读数据模型类,适合用于从数据库中提取数据并将其显示在 UI 组件中(如 QTableView 或 QComboBox)。
然后再用setModel将这个只读数据模型类显示在下拉框中
setModel() 函数将一个数据模型(如 QSqlQueryModel, QStandardItemModel, QAbstractItemModel 等)与一个视图关联。视图会根据模型提供的数据进行显示和操作,而模型负责管理和提供数据。
在这里插入图片描述

为什么创建这个对象的时候用*?

指针动态分配:当你使用 new 创建对象时,返回的是指向这个对象的指针。此时,你必须用指针来操作它(QSqlQueryModel *factoryModel)。指针可以让你在任何地方引用这个对象,而栈上创建的对象在作用域结束时会被销毁,无法持续使用。

那在这段语句中factoryModel->setQuery(“SELECT name FROM factory”);factoryModel是指针还是别的?

factoryModel 是通过指针操作符 -> 来访问其成员函数的。这个语法(->)表明 factoryModel 是一个指针,而不是直接的对象。
在 C++ 中,使用指针访问对象的成员时,必须使用 -> 操作符,而不是 . 操作符(用于非指针对象)。

QSqlQueryModel

还是先创建了一个对象
这行代码用于在 Qt 程序中创建一个 QSqlQueryModel 对象,用于显示和处理来自数据库的查询结果。具体解析如下:

  1. QSqlQueryModel 的作用
    QSqlQueryModel 是 Qt 中的一个模型类,专门用于显示从数据库中检索到的数据。它继承自 QAbstractTableModel,适合用来将 SQL 查询结果展示在视图控件(如 QTableView)中。
  • 它可以执行 SQL 查询,并将查询结果放入一个表格样式的模型中。
  • 这个模型可以被直接绑定到 Qt 的视图类(如 QTableView),以方便显示数据。
  1. 代码解析
QSqlQueryModel *factoryModel = new QSqlQueryModel(this);
  • QSqlQueryModel *factoryModel

    • 声明一个指向 QSqlQueryModel 对象的指针 factoryModel。这个指针会指向一个动态分配的 QSqlQueryModel 实例。
  • new QSqlQueryModel(this)

    • 这里使用 new 动态分配一个 QSqlQueryModel 对象。new 在堆内存上分配对象,并返回该对象的指针。
    • this:传递给 QSqlQueryModel 的构造函数。this 表示这个模型的父对象,通常是指向创建模型的窗口或其他 QWidget 对象。Qt 的对象树管理通过父子关系自动管理内存分配,因此 factoryModel 对象在其父对象销毁时会自动被清理,避免内存泄漏。
  1. 使用场景
    你可以使用 QSqlQueryModel 通过 SQL 查询从数据库中提取数据,并将其显示在界面上。例如,将工厂数据从数据库中提取并展示。

  2. 如何使用 QSqlQueryModel

QSqlQueryModel *factoryModel = new QSqlQueryModel(this);// 执行 SQL 查询并将结果存储到 model 中
factoryModel->setQuery("SELECT id, name FROM factory");// 将 model 绑定到视图,例如 QTableView
QTableView *view = new QTableView;
view->setModel(factoryModel);
view->show();
  1. QSqlQueryModel 的优点
  • 只读模型QSqlQueryModel 是一个只读模型,适用于不需要修改数据的场景。它能将查询结果自动映射到模型,并直接显示在视图上。
  • 与数据库无缝集成:你可以直接用它执行 SQL 查询,并通过 Qt 的视图控件来显示查询结果。

总结:

  • QSqlQueryModel 是一个轻量级的、只读的数据模型,用于显示数据库的查询结果。
  • 通过将查询结果与模型绑定,你可以轻松地在视图控件中展示数据,例如 QTableView
  • 该对象的生命周期由父对象 this 自动管理。

工具箱

调整布局

在这里插入图片描述
在这里插入图片描述
上一节我们在主界面中添加了工具箱和销售清单,那么可以在源文件中直接进行控件的布局调整

代码解析:

QSplitter *splitter = new QSplitter(ui->managePage);
  • QSplitterQSplitter 是 Qt 中的一个控件,它将多个子控件水平或垂直排列在一起,并允许用户通过拖动分割线调整这些控件的大小。
  • ui->managePageQSplitter 的父控件是 managePage,表示 QSplitter 将放置在 managePage 中。
splitter->resize(700, 360);
  • 通过 resize() 方法设置 QSplitter 的初始大小为 700 像素宽、360 像素高。
splitter->move(0, 50);
  • splitter 移动到 managePage 上的位置 (0, 50),这意味着 splitter 的左上角将在 managePage 的 (0, 50) 坐标处开始显示。

在这里插入图片描述

splitter->addWidget(ui->toolBox);
splitter->addWidget(ui->dailyList);
  • 通过 addWidget() 方法,将 toolBoxdailyList 添加到 splitter 中作为子控件。这意味着 toolBoxdailyList 将水平(或垂直)排列,并且用户可以通过拖动 splitter 的分割线来调整它们的大小。
splitter->setStretchFactor(0, 1);
splitter->setStretchFactor(1, 1);
  • setStretchFactor() 用于设置控件的大小伸缩比例。
    • splitter->setStretchFactor(0, 1);:设置 splitter 中第一个控件(toolBox)的伸缩因子为 1,表示它在调整大小时占用的比例与其他控件相等。
    • splitter->setStretchFactor(1, 1);:设置第二个控件(dailyList)的伸缩因子为 1,也同样会占据等比例的空间。

功能总结:

  • QSplittertoolBoxdailyList 水平排列,允许用户通过拖动分割线来调整它们的大小。
  • setStretchFactor() 将两个控件的空间调整因子都设置为 1,这意味着它们会以相等的比例分配空间,并在窗口大小变化时保持比例一致。

效果:
当你运行这段代码时,会看到一个带有可调整大小的分割条的 UI,用户可以拖动分割线在 toolBoxdailyList 之间调整它们的大小。

QT的布局调整还有哪些方式?

在 Qt 中,布局调整不仅限于在源文件中设置,还可以通过以下方式进行:
使用 Qt Designer 进行可视化布局设计。
调整 UI 组件属性 来控制布局行为。
使用 样式表(QSS) 来进行外观和布局的精细化控制。
编写 事件处理函数 动态调整布局。
通过 布局管理器 和 QSplitter 进行布局控制。
在运行时进行 动态布局调整。
这些方式为用户界面提供了灵活的布局管理方案。

这段代码在 Qt 中创建了一个 QSplitter 对象,并将其用来在 managePage 上管理两个可调整大小的控件(toolBoxdailyList)。QSplitter 是一个允许用户拖动边界来调整其包含的子控件大小的控件。

布局的逻辑是咋样的?

(先设置一个布局,然后再把控件给添加进去)

如何设置布局?

(QSplitter类,new一个,然后再用qsplitter->成员函数,设置布局大小,fixedsize(700,300),然后把这个sqplitter加载在某个窗口中,因为不是所有窗口都需要用这个布局,并调整他的位置,通过addwidget将ui->toolbox控件给加入到布局中

如何设置布局大小?
splitter->resize(700,360);

splitter:这是一个 QSplitter 对象,用于管理子控件(通常是多个 widget)的布局,允许用户通过拖动分割条来调整它们的大小。
resize(700, 360):这是 Qt 中的一个函数,用于调整控件的宽度和高度。

qsplitter对象加载在哪一个控件中?
QSplitter *splitter = new QSplitter(ui->managePage);

在一开始创建的时候,就
ui->managePage:QSplitter 的父控件是 managePage,表示 QSplitter 将放置在 managePage 中。
stacked widget下有两个控件
在这里插入图片描述
在这里插入图片描述

如何调整布局在整个页面中的位置?
splitter->move(0,50);
如果原先是随意排列的ui控件,再执行一次这个语句中,会改变ui的底层代码吗?

如果原先的 UI 控件是随意排列的,并且你在程序运行时执行一次布局设置的语句,那么布局会在运行时动态调整控件的位置和大小,但不会改变底层的 UI 代码。也就是说,布局调整是在内存中动态发生的,它不会影响或修改 .cpp 或 .ui 文件中的代码。
但我发现在源文件中设置可以由用户动态调整界面分割线之类,有这些操作
在这里插入图片描述

 splitter->setStretchFactor(0,1);splitter->setStretchFactor(1,1);

setStretchFactor() 用于设置控件的大小伸缩比例。
splitter->setStretchFactor(0, 1);:设置 splitter 中第一个控件(toolBox)的伸缩因子为 1,表示它在调整大小时占用的比例与其他控件相等。
splitter->setStretchFactor(1, 1);:设置第二个控件(dailyList)的伸缩因子为 1,也同样会占据等比例的空间。

默认两个控件以1:1的形式,但是可以由用户拖动分割线来调整大小

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com