QSqlDatabase(2)实例,QTableView显示数据库表数据

news2024/11/17 23:41:19

目录

前言

1、实现的功能

2、具体的代码实现


前言

想了解QSqlDatabase基本知识的,以及增删改查的用法,可以浏览上一篇文章:

QSqlDatabase(1)基本接口,以及(增删改除)的简单实例_Ivy_belief的博客-CSDN博客

这篇主要实战,写了一个数据动态库。

1、实现的功能

先来看看要实现的页面信息:

 数据库的动态库主要实现了:数据库的增、删、改、查的功能。

(1)增加数据的功能;

(2)删除数据的功能;

(3)修改数据的功能;

(4)查找数据的功能;

(5)用QTableView显示数据库表数据;

(6)直接执行sql语句的功能;

2、具体的代码实现

数据库测试工具GUI页面的主要功能:

(1)增加数据:

bool RobotDataBaseManager::addData2DB(string strOrderId, string strEntry, string strMoney, string strPlate, string strType, string strWeight)
{
    if (isOrderIdExist(strOrderId))
        return false;

    QString orderId = QString::fromStdString(strOrderId);
    QString entry = QString::fromStdString(strEntry);
    QString money = QString::fromStdString(strMoney);
    QString plate = QString::fromStdString(strPlate);
    QString type = QString::fromStdString(strType);
    QString weight = QString::fromStdString(strWeight);

    QSqlQuery query;
    QString sql = "INSERT INTO orderData (orderId, entry, money, plate, type, weight) VALUES (:orderId, :entry, :money, :plate, :type, :weight);";

    query.prepare(sql);
    query.bindValue(":orderId", orderId);
    query.bindValue(":entry", entry);
    query.bindValue(":money", money);
    query.bindValue(":plate", plate);
    query.bindValue(":type", type);
    query.bindValue(":weight", weight);

    if (!query.exec())
    {
        qDebug()<<tr("订单Id %1 ,加入缓存失败:%2").arg(orderId).arg(query.lastError().text());
        return false;
    }
    qDebug()<<tr("订单Id %1 已加入缓存").arg(orderId);

    return true;
}

(2)删除数据的功能;

bool RobotDataBaseManager::DeleteDataById(string strOrderId)
{
    qDebug() << "RobotDataBaseManager::DeleteDataById: " << QString::fromStdString(strOrderId);

    QString orderId = QString::fromStdString(strOrderId);

    QSqlQuery query;
    QString sql = "DELETE FROM orderData WHERE orderId=:orderId;";
    query.prepare(sql);
    query.bindValue(":orderId", orderId);
    if (!query.exec())
    {
        qDebug() << "into DeleteDataById ERROR: " << query.lastError().text();
        return false;
    }

    if(m_mutex4OrderId.tryLock(1*1000)==false)
        return false;

    m_curOrderId = orderId;
    m_mutex4OrderId.unlock();

    return true;
}

(3)修改数据的功能;

bool RobotDataBaseManager::UpdateDataById(string strOrderId, string strEntry, string strMoney, string strPlate, string strType, string strWeight)
{
    if (!isOrderIdExist(strOrderId))
        return false;

    QString orderId = QString::fromStdString(strOrderId);
    QString entry = QString::fromStdString(strEntry);
    QString money = QString::fromStdString(strMoney);
    QString plate = QString::fromStdString(strPlate);
    QString type = QString::fromStdString(strType);
    QString weight = QString::fromStdString(strWeight);

    qDebug()<< "orderId: " << orderId;
    qDebug()<< "entry: " << entry;
    qDebug()<< "money: " << money;
    qDebug()<< "plate: " << plate;
    qDebug()<< "type: " << type;
    qDebug()<< "weight: " << weight;

    QSqlQuery query;
    QString sql = "UPDATE orderData SET entry = :entry, money = :money, plate = :plate, type = :type, weight = :weight WHERE orderId=:orderId;";
    query.prepare(sql);

    query.bindValue(":orderId", orderId);
    query.bindValue(":entry", entry);
    query.bindValue(":money", money);
    query.bindValue(":plate", plate);
    query.bindValue(":type", type);
    query.bindValue(":weight", weight);

    if (!query.exec())
    {
        qDebug() << "UpdateDataById ERROR: " << query.lastError().text();
        return false;
    }

    if(m_mutex4OrderId.tryLock(1*1000)==false)
        return false;

    m_curOrderId = orderId;
    m_mutex4OrderId.unlock();

    return true;
}

(4)查找数据的功能;

bool RobotDataBaseManager::getDataById(string strOrderId, string& strEntry, string& strMoney, string& strPlate, string& strType, string& strWeight)
{
    qDebug() << "[数据库]:getDataById 查询所有数据: 开始~~~~~~~~~~~~~~~~~";

    QString orderId = QString::fromStdString(strOrderId);

    QSqlQuery query;
    QString sql = "SELECT * FROM orderData WHERE orderId=:orderId;";
    query.prepare(sql);
    query.bindValue(":orderId", orderId);

    if (!query.exec())
    {
        qDebug() << "into getDataById ERROR: " << query.lastError().text();
        return false;
    }

    while (query.next())
    {
        QString orderId = query.value("orderId").toString();

        qDebug() << "取得1条订单缓存数据: " << orderId;
        if (!orderId.isEmpty())
        {
            strEntry = query.value("entry").toString().toStdString();
            strMoney = query.value("money").toString().toStdString();
            strPlate = query.value("plate").toString().toStdString();
            strType = query.value("type").toString().toStdString();
            strWeight = query.value("weight").toString().toStdString();
        }
    }

    query.exec("SELECT * FROM orderData");

    qDebug() << "[数据库]:SELECT * FROM orderData:";

    while (query.next())
    {
        // 读取字段值
        QString name = query.value("entry").toString();
        QString money = query.value("money").toString();
        QString plate = query.value("plate").toString();
        QString type = query.value("type").toString();
        QString weight = query.value("weight").toString();

        // 输出结果
        qDebug() << "entry:" << name << ", money:" << money << ", plate:" << plate << ", type:" << type << ", weight:" << weight;
    }


    qDebug() << "[数据库]:getDataById 查询所有数据: 结束~~~~~~~~~~~~~~~~~";
    return true;
}

(5)用QTableView显示数据库表数据;

void RobotDataBaseManager::on_btn_showAll_clicked()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "Connection1");
    db.setDatabaseName("trawe.db"); // 数据库文件名


    if (!db.open())
    {
        qDebug() << "Failed to connect to database 1.";
        return;
    }

    QSqlQuery query(db);
    QString selectQuery = "SELECT * FROM orderData";
    if (!query.exec(selectQuery))
    {
        qDebug() << "Failed to select data from trawe.db.";
        return;
    }

    QSqlTableModel * model = new QSqlTableModel(this,db);
    model->setTable("orderData");
    ui->tableView->setModel(model);
    model->select();

    QStringList tables;
    tables << "id"<< "订单id" << "入口" << "金额" << "车牌" << "车型" << "重量" << "时间";
    for(int i = 1 ; i < tables.count(); i++)
        model->setHeaderData(i,Qt::Horizontal,tables[i]);//设置显示框表头显示
    model->setSort(1, Qt::AscendingOrder);//设置按照第0列排序
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置单元格不可编辑
    ui->tableView->horizontalHeader()->setStretchLastSection(true);//设置最后一列填充后面表格
    //ui->tableView->setColumnHidden(0,true);//设置第0行隐藏
    ui->tableView->setColumnWidth(1,100);//设置列宽,界面看起来更舒适
    ui->tableView->setColumnWidth(2,100);//设置列宽,界面看起来更舒适
}

(6)直接执行sql语句的功能;

/*
(1)INSERT INTO orderData (orderId, entry, money, plate, type, weight) VALUES ("63945", "滘口", "99", "粤G717Q1", "客一", "1800");
(2)UPDATE orderData SET entry = "滘口", money = "99", plate = "粤G717Q1", type = "客一", weight = "客一" WHERE orderId="22834";
(3)DELETE FROM orderData WHERE orderId=1234567;
*/
bool RobotDataBaseManager::queryExec(string strSql)
{
    QString sql = QString::fromStdString(strSql);

    QSqlQuery query;
    query.prepare(sql);
    if (!query.exec())
    {
        qDebug() << " queryExec ERROR: " << query.lastError().text();
        return false;
    }

    qDebug() << "[数据库]: sql 语句执行成功: 结束~~~~~~~~~~~~~~~~~";
    return true;
}

上面基本也涵盖主要的代码了。

完整的项目代码已上传,需要的可以下载。

QSqlDatabase实现数据库的基本功能,以及QTableView显示数据库表数据资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云云服务器评测|基于华为云云耀云服务器L实例开展性能评测,例如 MySQL、Clickhouse、Elasticsearch等等

在当今云计算时代&#xff0c;越来越多的企业和个人开始选择将应用部署在云服务器上&#xff0c;以便更好地满足高性能、可靠性和可扩展性等需求。而华为云云耀云服务器L实例不仅提供了高性能和可靠性的计算和存储资源&#xff0c;而且具有灵活和高效的成本控制&#xff0c;深受…

红黑树(AVL树的优化)上

红黑树略胜AVL树 AVL树是一颗高度平衡搜索二叉树&#xff1a; 要求左右高度差不超过1&#xff08;严格平衡&#xff09; 有的大佬认为AVL树太过严格&#xff0c;对平衡的要求越严格&#xff0c;会带来更多的旋转&#xff08;旋转也还是会有一定的消耗&#xff01;&#xff01;…

05-基础例程5

基础例程5 1、超声波测距 实验介绍 ​ HC-SR04超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。 外观 管脚功能的定义 VCC&#xff1a;供电电源&#xff1b;Trig&#xff1a;触发信号&#xff1b;Echo&a…

元素居中的方法总结

垂直居中 行内元素垂直居中 单行文本垂直居中 1.line-height: 200px; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&…

0基础学习VR全景平台篇 第92篇:智慧景区教程

一、上传素材 1.上传全景素材 第一步&#xff1a;进入【素材管理】 第二步&#xff1a;选择【全景图智慧景区】分类 第三步&#xff1a;选择相对景区作品分组&#xff0c;上传全景素材 2.素材标注 第一步&#xff1a;选择上传成功后素材&#xff0c;点击【未标注】 第二步&…

继承

目录 引入 继承介绍 概念 优点 分类 公有继承 保护继承 私有继承 特点 单继承 多继承 赋值 介绍 分类 对象之间赋值(拷贝构造) 验证普通赋值需要创建临时变量 指针/引用赋值 赋值原理 继承中的作用域 介绍 隐藏 / 重定义 前提 介绍 派生类的默认成员函…

TIA博途_更新或修改程序时,如何避免数据块中的参数丢失?

TIA博途_更新或修改程序时,如何避免数据块中的参数丢失? DB 快照功能 可以通过捕获 DB 块变量实际值快照用于恢复值操作,捕获的实际快照值可以复制到 CPU 中的实际值中,也可以用于替换变量的起始值。 通过快照能解决以下场景的问题: • 在 HMI 中设置了很多工艺参数,担心…

python怎么提取视频中的音频

目录 操作步骤 1. 安装MoviePy库&#xff1a; 2. 导入MoviePy库和所需的模块&#xff1a; 3. 提取音频&#xff1a; 可能遇到的问题 1. 编解码器支持&#xff1a; 2. 依赖项安装&#xff1a; 3. 文件路径问题&#xff1a; 4. 内存消耗&#xff1a; 5. 输出文件大小&a…

Rabbitmq的消息转换器

Spring会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象 ,只不过&#xff0c;默认情况下Spring采用的序列化方式是JDK序列化。众所周知&#xff0c;JDK序列化存在下列问题&#xff1a; 数据体积过大 有安全漏洞 可读…

水稻叶病害数据集(目标检测,yolo使用)

1.数据集文件夹 train文件夹&#xff08;44229张&#xff09;&#xff0c;test文件夹&#xff08;4741张&#xff09;&#xff0c;valid文件夹&#xff08;6000张&#xff09; 2.train文件夹展示 labels展示 标签txt展示 data.yaml文件展示 对数据集感兴趣的可以关注最后一行…

vue cli构建的项目出现 Uncaught runtime errors

使用 vue/cli 脚手架构建的项目&#xff0c;在 npm run dev 运行后&#xff0c;页面出现 Uncaught runtime errors 报错遮罩层&#xff0c;如下图所示。 报错原因 这种错误通常是运行时出的问题&#xff0c;可能是网络错误&#xff0c;可能是变量未定义等等。 这种错误默认在开…

华硕笔记本摄像头倒置怎么办?华硕笔记本摄像头上下颠倒怎么调整

笔记本电脑相较于台式电脑&#xff0c;更易携带&#xff0c;解决了很大一部分人的使用需求。但是笔记本电脑也存在很多不足&#xff0c;比如华硕笔记本电脑就经常会出现摄像头倒置的错误&#xff0c;出现这种问题要如何修复呢&#xff1f;下面就来看看详细的调整方法。 华硕笔记…

linux的make和makefile学习

linux的make和makefile学习 准备工作使用GNU链接库链接到math库编写复利程序 创建自己的库链接到主目录 不同的C标准 准备工作 安装GCC和Make工具 安装中文输入法 参考&#xff1a;http://t.csdn.cn/eH0Ow sudo apt-get update sudo apt-get install ibus sudo apt-get inst…

Flutter Web 项目网络请求报 XMLHttpRequest error 解决方案

使用http库进行简单的网络请求时&#xff0c;运行在Chrome浏览器上&#xff0c;网络请求一直报错 XMLHttpRequest error&#xff0c;而在iOS 模拟器上运行则正常&#xff0c;后面在postman上发送请求&#xff0c;也是正常的。这就是很尴尬了&#xff01;&#xff01;&#xff0…

JavaScript基础知识1

基本说明 1.JavaScript能改变html内容&#xff0c;能改变html属性&#xff0c;能改变html样式&#xff08;CSS&#xff09;&#xff0c;能完成页面的数据验证。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

深入理解 JVM 之——动手编译 JDK

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 本篇为深入理解 Java 虚拟机第一章的实战内容&#xff0c;推荐在学习前先掌握基础的 Linux 操作、编译原理基础以及扎实的 C/C 功底。 该系列的 GitHub 仓库&#xff1a;https://github.com/Doge2077/lear…

iOS开发Swift-3-UI与按钮Button-摇骰子App

1.创建新项目Dice 2.图标 删去AppIcon&#xff0c;将解压后的AppIcon.appiconset文件拖入Assets包。 3.将素材点数1-6通过网页制作成2x&#xff0c;3x版本并拖入Asset。 4.设置对应的UI。 5.拖入Button组件并设置style。 6.Ctrl加拖拽将Button拖拽到ViewController里&#xff0…

MySQL8.0.22安装过程记录(个人笔记)

1.点击下载MySQL 2.解压到本地磁盘&#xff08;注意路径中不要有中文&#xff09; 3.在解压目录创建my.ini文件 文件内容为 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] # 设置端口 port 3306 # 设计mysql的安装路径 basedirE:\01.app\05.Tool…

动手学深度学习(四)多层感知机

经过了多层感知机后&#xff0c;相当于将原始的特征转化成了新的特征&#xff0c;或者说提炼出更合适的特征&#xff0c;这就是隐藏层的作用。 from&#xff1a;清晰理解多层感知机和反向传播 - 知乎 一、多层感知机的从零开始实现 import torch from torch import nn from d2…

阿里云大数据实战记录8:拆开 json 的每一个元素,一行一个

目录 一、前言二、目标介绍三、使用 pgsql 实现3.1 拆分 content 字段3.2 拆分 level 字段3.3 拼接两个拆分结果 四、使用 ODPS SQL 实现4.1 拆分 content 字段4.2 拆分 level 字段4.3 合并拆分 五、使用 MySQL 实现六、总结 一、前言 商业场景中&#xff0c;经常会出现新的业…