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

多线程

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

#include <QThread>


class MyWidget : public QWidget
{
    Q_OBJECT

public:
    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.实例化model
    model = 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();

}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux软硬链接及动静态库

软硬链接与动静态库 软连接 创建链接的方法&#xff1a; ln -s test1.txt test2.txt 其中ln 是link(链接)&#xff0c;-s 是soft(软)&#xff0c;后者链接前者。 此时打开test2.txt&#xff0c;发现其中内容与test.txt一致。那么软连接到底建立了什么联系&#xff1f;…

【笔记】软件架构师要点记录(2)

【笔记】软件架构师要点记录 20240523案例一案例二案例三案例四案例五案例六案例七案例十 20240523 基于前10个架构案例场景&#xff0c;对用到的专业术语进行整理&#xff0c;方便后续查看。 案例一 MVC架构风格组件交互方式 MVC是一种用来构建用户界面时采用的架构设计风格…

分布式Id/框架/发号器一文介绍

文章目录 一、分布式id介绍1、什么是分布式id2、分布式id的特点 二、UUid生成算法1、JDK UUID2、Snowflake 雪花算法3、PearFlower 梨花算法4、Mist 薄雾算法 三、常见发号器服务1、数据库1&#xff09;自增2&#xff09;号段模式 2、NoSQL 四、常见框架1、百度UIDGenerator2、…

基于BERT的中文情感分析实战

数据与代码链接见文末 bert开源项目解读:谷歌开源项目BERT源码解读与应用实例-CSDN博客 基于BERT的中文命名实体识别识别实战:基于BERT的中文命名实体识别识别实战-CSDN博客 1.数据 在data目录下,提供了中文情感分析的数据, 类别1代表正向情感,类别2代表负向情感。

打气球小游戏

1.气球往上飘 我们声明两个符号常量来作为窗体的长和宽,接着就是常规操作 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600#include<easyx.h> #include<stdio.h> int main() {initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);setbkcolor(WHITE);cleardevice();get…

几年前写的一个小工具

几年前写的一个工具&#xff0c;开发工具 是Delphi7 UniDAC FastReport2.53 &#xff0c;开发时间不到8小时&#xff08;同时还在处理其他事情&#xff09;。 其实把这个翻出来&#xff0c;是想说说俺的一个同事。他是俺这几年遇到的最优秀的人之一。他负责售后维护部&#x…

浅谈AI大模型的数据特点和应用问题

【摘要】AI大模型的训练、推理及应用落地都需要大量的数据&#xff0c;其数据具有参数和数据量大、质量要求高、行业垂直属性强、资源消耗大等特点&#xff0c;由此带来的个人隐私泄露、数据中毒、数据篡改等数据安全风险已成为业界必须应对的重要议题。目前大模型的规模化应用…

使用 LlamaParse 进行 PDF 解析并创建知识图谱

此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性&#xff0c;适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…

怎么判断一家公司是否有前景

前段时间&#xff0c;有个老铁&#xff0c;给我发了一长串文字&#xff0c;看得我头皮发麻。 好在&#xff0c;他情商很高&#xff0c;买了我一个小时的时间&#xff0c;我才硬着头皮看完&#xff0c;根据他的情况&#xff0c;跟他打了电话交流。 他目前的处境&#xff0c;是在…

干G货,性能测试基本方法和原则,

一、性能测试关键点 评估性能指标——线程tps&#xff08;可架构给&#xff09; 吞吐量qps&#xff08;可架构给&#xff09; 错误率&#xff08;可架构给&#xff09; 平均响应时间&#xff08;可架构给&#xff09;模拟线上数据量了解接口有没有缓存&#xff0c;有缓存的需要…

HIOKI日置阻抗分析仪IM7583

HIOKI日置阻抗分析仪IM7583 HIOKI日置阻抗分析仪IM7583 HIOKI日置阻抗分析仪IM7583 功率分析仪 PW6001 基本参数 测量线路 单相2线&#xff0c;单相3线&#xff0c;三相3线&#xff0c;三相4线 输入通道数 zui大6ch&#xff0c;电压/电流同时单位是1ch &#xff08;电压测…

ClickHouse配置与使用

静态IP配置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.128 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

OSPF路由聚合

原理概述 与RIP不同&#xff0c;OSPF不支持自动路由聚合&#xff0c;仅支持手动路由聚合。OSPF的路由聚合有两种机制&#xff1a;区域间路由聚合和外部路由聚合。区域间路由聚合必须配置在ABR路由器上&#xff0c;指的是ABR在把与自己直接相连区域&#xff08;Area&#xff09…

5.23.1 深度学习在乳腺癌成像中的应用

乳腺成像在早期发现乳腺癌以及在治疗期间监测和评估乳腺癌方面发挥着重要作用。最常用的乳腺成像方式是数字乳房X线摄影、数字乳腺断层合成、超声和磁共振成像。 传统的 CAD 系统基于传统的机器学习 (ML) 技术&#xff1b;预定义&#xff08;手工制作&#xff09;的特征是系统…

汽车摄像头智能画质增强解决方案,高品质车载视觉系统

在数字化与智能化浪潮的推动下&#xff0c;汽车行业正经历着一场前所未有的技术革命。其中&#xff0c;车载摄像头作为智能驾驶与安防监控的核心部件&#xff0c;其画质的高低直接关系到行车安全与驾驶体验。美摄科技&#xff0c;作为行业领先的智能图像技术解决方案提供商&…

想在抖音做电商怎么操作?我的建议是......

我是王路飞。 想在抖音做电商&#xff0c;应该怎么操作呢&#xff1f; 我的建议是&#xff0c;开通一个抖音小店就可以了~ 想了解抖音电商内容的&#xff0c;可以认真看完这篇文章~ 内容来源于【电商王路飞】 先给你们解答一些概念类的问题。 抖店和橱窗是一个东西吗&…

不闭合三维TSP:蛇优化算法SO求解不闭合三维TSP(起点固定,终点不定,可以更改数据集),MATLAB代码

旅行商从城市1出发&#xff0c;终点城市由算法求解而定 部分代码 close all clear clc global data load(data.txt)%导入TSP数据集 Dimsize(data,1)-1;%维度 lb-100;%下界 ub100;%上界 fobjFun;%计算总距离 SearchAgents_no100; % 种群大小&#xff08;可以修改&#xff09; …

Centos7.9安装卸载Docker

文章目录 1、官网安装1.1、卸载旧版本Docker1.2、通过rpm仓库安装1.2.1、设置仓库1.2.2、安装Docker Engine1.2.3、启动Docker1.2.4、验证安装 1.3、通过rpm软件包安装1.4、通过便捷脚本安装 2、yum安装2.1、安装docker-ce以及客户端2.2、启动docker2.3、配置镜像加速 3、卸载D…

【情感大师智能体】:定制专属情感支持

文章目录 &#x1f4d1;前言一、快速创建智能体二、配置表单2.1 基础配置2.2 指令配置什么是指令&#xff08;prompt&#xff09;&#xff1f; 2.3 我的指令如下&#xff1a; 三、体验发布四、小结 &#x1f4d1;前言 随着智能体技术的快速发展&#xff0c;用户对智能体的需求不…

buuctf的RSA(二)

1.RSA 知道 flag.enc 和 pub.key&#xff0c;典型的加密、解密 将pub,key 改为pub.txt 打开后发现公钥 在RSA公私钥分解 Exponent、Modulus&#xff0c;Rsa公私钥指数、系数(模数)分解--查错网 进行解密 得到e65537 n8693448229604811919066606200349480058890565…