QT7_视频知识点笔记_5_线程,数据库

多线程

两种办法:第一种:Qt4.7之前的线程使用的方法(简单);第二种:Qt4.7之后的(灵活–推荐)----connect最后一个参数的作用:默认连接,队列连接,直接连接
现只举例第二种办法:
主线程:为MyWidget中定时器显示
子线程:为MyWork中的业务处理函数

#include <QThread>class MyWidget : public QWidget
{Q_OBJECTpublic:explicit MyWidget(QWidget *parent = 0);~MyWidget();// 开始按钮(主线程)void slotStart();// 关闭按钮(主线程)void slotStop();// 开始按钮(子线程)void slotStart_1();// 关闭按钮(子线程)void slotStop_1();// 定时器void slotTimeout();// 关闭线程void slotCloseThread();signals:void sigWorking();private:Ui::MyWidget *ui;QTimer* mytimer;MyWork *work;QThread* pthread;
};

最主要的部分:1.业务对象(自己写的业务类) 2.子线程类QThread类 3.移动业务对象到子线程moveToThread 4.子线程工作connect

MyWidget::MyWidget(QWidget *parent) : QWidget(parent),ui(new Ui::MyWidget)
{ui->setupUi(this);/* 多线程使用注意事项:* 1. 业务对象, 构造的时候不能指定父对象* 2. 子线程中不能处理ui窗口(ui相关的类)* 3. 子线程中只能处理一些数据相关的操作, 不能涉及窗口*/mytimer  = new QTimer(this);// 1. 业务对象work = new MyWork();// 2. 子线程类pthread = new QThread(this);// 3. 移动业务对象到子线程work->moveToThread(pthread);// 5. 子线程工作connect(this, &MyWidget::sigWorking, work, &MyWork::doMyWork);connect(ui->start, &QPushButton::clicked, this, &MyWidget::slotStart);connect(ui->stop, &QPushButton::clicked, this, &MyWidget::slotStop);connect(ui->start_1, &QPushButton::clicked, this, &MyWidget::slotStart_1);connect(ui->stop_1, &QPushButton::clicked, this, &MyWidget::slotStop_1);// 定时器connect(mytimer, &QTimer::timeout, this, &MyWidget::slotTimeout);// 窗口析构的时候干掉线程connect(this, &MyWidget::destroyed, this, &MyWidget::slotCloseThread);qDebug() << QThread::currentThread() << "main thread";/* connect 的第 5 参数* 1. 自动连接 -- 默认*      多线程 -- 指定队列连接*      单线程 -- 指定直接连接* 2. 队列连接 -- 多线程*      槽函数在信号接受者(receiver)所在的线程中执行* 3. 直接连接 -- 单线程*      信号和槽函数在同一个线程中执行*/
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::slotStart()
{if(mytimer->isActive() == true){qDebug() << "mytimer->isActive() == true";return;}qDebug() << "mytimer->start";mytimer->start(500);}void MyWidget::slotStop()
{mytimer->stop();    //此按钮主线程(MyWidget计时器)暂停
}void MyWidget::slotStart_1()
{if(pthread->isRunning()){qDebug() << "pthread->isRunning()";return;}qDebug() << "pthread->start";// 4. 启动子线程pthread->start();work->setFlage(false);// 发信号, 让子线程工作emit sigWorking();
}void MyWidget::slotStop_1()
{qDebug() << "slotStop_1";work->setFlage(true);pthread->quit();}
void MyWidget::slotTimeout()
{static int num = 0;ui->lcdNumber->display(num++);
}void MyWidget::slotCloseThread()
{work->setFlage(true);pthread->quit();pthread->wait();    // 等待线程手头上的工作处理完成
}
#include <QThread>class MyWork : public QObject
{Q_OBJECT
public:explicit MyWork(QObject *parent = 0);// 业务处理函数void doMyWork();void setFlage(bool bl);signals:void sigDone();public slots:
private:bool isStop;
};

MyWork::MyWork(QObject *parent) : QObject(parent)
{isStop = false;
}void MyWork::doMyWork()
{qDebug() << "isStop1:"<<isStop;while(!isStop){qDebug() << "isStop2:"<<isStop;if(isStop){break;}// 操作QThread::sleep(1);  // 当前线程处理操作用了1s// 每执行一次循环发一次信号emit sigDone();qDebug() << QThread::currentThread() << "sub thread";// QMessageBox::aboutQt(NULL);}
}void MyWork::setFlage(bool bl)
{qDebug() << "setFlage:"<<bl;isStop = bl;
}

最后效果:
在这里插入图片描述

数据库操作

1.QSqlDataBase:数据库类,用来添加数据库
pro文件中添加sql
添加头文件:
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlError>//添加一个mysql数据库//1.QSQLITE-->XX.db文件     2.QMYSQL//QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");        //使用QMYSQL暂时还有一点问题,这里使用QSQLITE,本地的db文件做QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("TestResult.db");//连接的数据库名TestResult.db//打开数据库if(db.open()==false){//弹窗提示QMessageBox::warning(this,"warning",db.lastError().text());}else{QMessageBox::warning(this,"warning","db.open");}
2.QSqlQuery:数据库查询类,(需要会一些SQL语句)

添加一条记录:

//增删查改 ...qDebug()<<"QSqlQuery query";//添加一条记录    QSqlQuery需要用到SQL语句QSqlQuery query;QString sql = "insert into people(name,age) values('zzz',123)";     //需要db文件中有people表,表中有name和age字段query.exec(sql);

批处理方式一:

    //2.批处理方式一:预处理    ---通配符:‘?’,odbc风格的通配符query.prepare("insert into people(name,age) values(?,?)");      //要注意格式不能写错了//添加绑定数据,需要跟上面的通配符对应起来QVariantList nameList;          //Variant中可以放任意的数据nameList << "aax" << "bbx" << "ccx";query.addBindValue(nameList);QVariantList ageList;ageList << 12 << 13 << 14;query.addBindValue(ageList);//执行批处理query.execBatch();

在这里插入图片描述

批处理方式二:

    //3.批处理方式二:oracle风格的通配符(更加灵活,推荐)//定义方式:  :+自定义名query.prepare("insert into people(name,age) values(:name,:age)");//添加绑定数据,需要跟上面的通配符对应起来QVariantList nameList;          //Variant中可以放任意的数据nameList << "aa" << "bb" << "cc";query.bindValue(":name",nameList); //通配符名字,通配符QVariantList ageList;ageList << 11 << 22 << 33;query.bindValue(":age",ageList);//执行批处理query.execBatch();

在这里插入图片描述
数据库查询:

//4.数据库查询//4.数据库查询query.exec("select * from people");//如何把返回的值取出来(⭐)while(query.next()) //如果query不为空,(遍历每一条记录){//0 --第一个字段的索引值qDebug()<<query.value(0).toString()	//这个0是指exec取出的表中第一个数据类型<<query.value("age").toInt();}//    //或者,
//    query.exec("select age from people");
//    while(query.next()) //如果query不为空,(遍历每一条记录)
//    {
//        //0 --第一个字段的索引值
//        qDebug()<<query.value(0).toInt();   //这样的话此处query.value(0)就为age
//    }

在这里插入图片描述

3.QSqlTableModel:数据模型。不需要掌握SQL语句,已经在内部做了SQL语句的封装。(创建对象,设置数据库表,将model放入view(QTableView)中,显示(查询)数据,设置表头(setHeadData),setEditStartegy()
//头文件
#include <QSqlTableModel>   //数据模型
//显示模型中的数据则需要使用视图:QTableView - QSqlTableModel
// qt中的 model-view模型//前提条件:在步骤1中QSqlDataBase,正常打开数据库
	//1.实例化modelmodel = new QSqlTableModel(this);//2.将模型设置到视图中ui->tableView->setModel(model);		//在ui中添加//3.给model设置数据库表 -- 前提条件:数据库model->setTable("people");//4.查询表,只有进行查询,model中才会有数据model->select();//设置(更改)表头model->setHeaderData(0,Qt::Horizontal,"编号");      //第一个参数section是字符串截取

在这里插入图片描述
需要注意的地方:ui修改自动同步到数据库的风险

	//需要注意的是,在ui中修改的话数据库默认也随之更改//5.解决办法:设置提交模式,F1查看函数用法,设置为手动提交,在UI上修改之后需要手动提交DB文件才会进行修改。model->setEditStrategy(QSqlTableModel::OnManualSubmit);.......//在UI中增加一个提交UI修改的按钮,一个撤销的按钮void Widget::on_pushButton_clicked()
{qDebug()<<"on_pushButton_clicked";model->submitAll();
}void Widget::on_pushButton_revent_clicked()
{qDebug()<<"on_pushButton_revent_clicked";model->revertAll(); //撤销步骤model->submitAll(); //提交步骤  --更新数据模型
}

查询数据,此处举例按名字查询,UI上增加输入框和查询按钮


void Widget::on_pushButton_search_clicked()
{qDebug()<<"on_pushButton_revent_clicked";QString name = ui->lineEdit->text();    //获取需要查询的人名//设置过滤条件查询//与SQL语句对比:“select * from aa where name = 'xiaoming'QString sql = QString ("name = '%1'").arg(name);model->setFilter(sql);//重新查询model->select();}

在这里插入图片描述

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

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

相关文章

操作系统总结4----死锁的处理策略总结

目录 2.4.2 死锁的处理策略-----预防死锁 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;破环互斥条件 &#xff08;3&#xff09;破环不剥夺条件 &#xff08;4&#xff09;破环求情和保持条件 &#xff08;5&#xff09;破环循环等待条件 总结 2.4.3 死…

AI革命:生活无处不智能

AI革命&#xff1a;生活无处不智能 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0…

使用FFmpeg推流实现在B站24小时点歌直播

使用FFmpeg推流实现在B站24小时点歌直播 本文首发于个人博客 安装FFmpeg centos7 https://www.myfreax.com/how-to-install-ffmpeg-on-centos-7/ https://linuxize.com/post/how-to-install-ffmpeg-on-centos-7/ 使用FFmpeg在B站直播 https://zhuanlan.zhihu.com/p/2395…

竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

FreeRTOS任务间通信“IPC”

---------------信号量--------------- 信号量的定义&#xff1a; 操作系统中一种解决问题的机制&#xff0c;可以实现 “共享资源的访问” 信号&#xff1a;起通知作用量&#xff1a;还可以用来表示资源的数量当"量"没有限制时&#xff0c;它就是"计数型信…

C++原创人工智能QPBS01G大功告成!!!

俗话说得好&#xff0c;你周五周六不写作业&#xff0c;要上学了才着急了 我之前的版本bug太多&#xff0c;结果这两天晚上改的我两眼发白&#xff0c;太烦人了 这次这娃学聪明了&#xff0c;遇到不会的问题上网搜&#xff0c;我还更新了反骂人骂人功能&#xff0c;第一次测试…

抖音小店新规又来了!平台下调了两项门槛,惊掉商家下巴!

大家好&#xff0c;我是电商糖果 平台这几年为了快速发展电商项目&#xff0c;一直在向商家释放友好政策&#xff0c;目的就是为了吸引更多的商家入驻。 这不官方5月30日起下调了两个门槛&#xff0c;让不少商家大呼不可思议。 第一个就是保证金下调。 平台按照商家经营类目…

ProxySQL路由策略实现读写分离

目的&#xff1a;配置proxysql路由策略后将不同用户的不同请求路由到不同的节点&#xff0c;实现读写分离 前提条件&#xff1a; 配置表mysql_replication_hostgroups&#xff0c;10为写组&#xff0c;20为读组 mysql_users表中已添加用户writer用户加入10写组&#xff0c;rea…

【QT八股文】系列之篇章3 | QT的多线程以及QThread与QObject

【QT八股文】系列之篇章3 | QT的多线程 前言4. 多线程为什么需要使用线程池线程池的基础知识python中创建线程池的方法使用threading库队列Queue来实现线程池使用threadpool模块&#xff0c;这是个python的第三方模块&#xff0c;支持python2和python3 QThread的定义QT多线程知…

下一代Docker会让部署更丝滑吗

下一代Docker会让部署更丝滑吗 如何通俗易懂的理解DockerDocker有什么缺点Docker与AI结合&#xff0c;会让部署更加丝滑吗 随着互联网技术的不断发展&#xff0c;单机系统已经无法满足日益正常的用户量以及正常处理用户请求&#xff0c;这个时候就需要进行多机部署&#xff0c;…

k8s-helloword部署一个应用

k8s-helloword部署一个应用 快速部署一个pod命令 部署一个名为 test-nginx Pod 方式一&#xff1a;使用 kubectl run kubectl run test-nginx --imagenginx然后使用 kubectl get pod 查看&#xff0c;kubectl get pod 是查看默认名称空间下的Pod 如果想要跟详细的查看这个…

四元数学习总结(1)

导语&#xff1a;相比矩阵&#xff0c;用四元数处理3D旋转的优势是毋庸置疑的&#xff0c;但由于概念复杂&#xff0c;难于理解&#xff0c;一直令我摸不着头脑。最近学习更是发现在机器人、无人机、SLAM等先进领域&#xff0c;四元数被当成实数、整数这样的基础&#xff0c;所…

SQLiteOpenHelper数据库帮助器

SQLiteOpenHelper数据库帮助器是Android提供的数据库辅助工具。 1、继承SQLiteOpenHelper类&#xff0c;需要重写onCreate和onUpgrade两个方法 案例&#xff1a;实现增删改查 package com.example.databases_text;import android.app.PictureInPictureParams; import androi…

FPGA 纯逻辑arinc818 ip core

1、 符合FC-FS、FC-AV、FC-ADVB协议规范&#xff1b; 2、符合ARINC818协议规范&#xff1b; 3、支持光纤通信Class1、Class3服务&#xff1b; 5、可动态配置光纤端口速率&#xff0c;支持1.0625Gbps、2.125Gbps、3.1875Gbps、4.25Gbps可配置&#xff1b; 6、DDR控制接口简洁…

企业级架构及本体论最新进展

本文主要探讨了企业级架构和本体论的新兴趋势&#xff0c;特别是DoDAF、IDEAS、UAF和NAF的发展历程、理论基础、模型构建以及与ArchiMate和语义网技术的关联。原文: The emerging landscape of Enterprise Architecture and Ontology 导言 动机和采用的方法 关注我的人都知道我…

如何修复 System has not been booted with systemd 报错信息?

如何修复 System has not been booted with systemd 报错信息&#xff1f; 一、问题描述&#xff1a; 我们在学习 linux 系统时&#xff0c;使用 systemd 命令&#xff08;比如 sudo systemctl status ssh&#xff09;&#xff0c;可能会遇到一个报错信息&#xff1a; System…

【图论】最短路(一)

发现之前做的题很乱&#xff0c;用小笔记把看过的博客和题目分类记录一下&#xff0c; 代码参考了很多佬&#xff0c;是标注出来的链接&#xff0c;若不同意我就删掉&#xff08;鞠躬&#xff09; 找了几张好点的&#xff0c;图来源图中的id和acwing 1.dijkstra 依次找到距…

KubeKey 安装 K8s

官网教程 在 Linux 上以 All-in-One 模式安装 KubeSphere 步骤 1&#xff1a;准备 Linux 机器 若要以 All-in-One 模式进行安装&#xff0c;您仅需参考以下对机器硬件和操作系统的要求准备一台主机。 硬件推荐配置 操作系统最低配置Ubuntu 16.04, 18.04, 20.04, 22.042 核 …

windows服务器安装TortoiseSVN教程

TortoiseSVN也称小乌龟~ 下载链接&#xff1a; https://www.liqucn.com/rj/91608.shtml 下载完成后&#xff0c;先安装TortoiseSVN&#xff0c;安装完成后&#xff0c;根据需要安装中文包 安装比较简单直接下一步即可&#xff0c;注意安装路径根据需要调整到非c盘。 安装中…

超详细的前后端实战项目(Spring系列加上vue3)前端篇+后端篇(三)(一步步实现+源码)

好了&#xff0c;兄弟们&#xff0c;继昨天的项目之后&#xff0c;开始继续敲前端代码&#xff0c;完成前端部分&#xff08;今天应该能把前端大概完成开启后端部分了&#xff09; 昨天补充了一下登录界面加上了文章管理界面和用户个人中心界面 完善用户个人中心界面 修改一…