qt 线程和数据库

线程速览

线程启动 start(),配合以下:

QMutex m_mutex;

while (!isInterruptionRequested()) {  // isInterruptionRequested 决定线程停止,就是循环条件

QMutexLocker lock(&m_mutex); // 给线程买一把锁

}

线程暂停:m_mutex.lock();

线程继续:m_mutex.unlock();

线程结束:
thread->requestInterruption(); // 循环退出,实现机制实际上是通过互斥锁+标识变量,通过维护标示变量来指定线程是否运行
thread->quit(); // 可以加上这个 等同exit(0) 即退出程序,停止线程
thread->wait();//但线程的结束并不是立刻进行的,可能是稍后发生的,如果在线程还未停止前调用了delete方法,会引发crash,这句话的意思是等待线程完全停止,然后再去delete

delete thread;

 

qt线程(2种方式):

1:

新建一个继承 QThread 的类myTherad(不能有ui),重写 run() 函数(真正新线程处理的地方,因为不方便随时调用所以一般是个while循环) 。

主线程 new 上面的那个类 myTherad* _myTherad =  new myTherad(this)

开始运行 run() : _myTherad.start();

关闭子线程:退出循环 //不退也行;\n  _myTherad->quit(); // 它会等你数据处理完了再操作,类似 exit(0) \n _myTherad->wait() // 等待你处理完回收资源

2(这种方式可以很方便随时调用方法使其在新线程运行): 

先随意新建一个类 classTs,类里面有些方法

classTs* ts = new classTs; // 这里不能用this,因为你整个是要给子线程的

QThread* _myTherad = new QThread(this); // 创建子线程

ts->moveToThread(_myTherad ); // 把你随意建的类移动到子线程里面去,现在那个类就是属于子线程的人了

_myTherad->start(); // 开启线程

现在开始classTs类里的函数就都是在子线程里面运行了,至于怎么触发classTs类的函数,一般用型号槽,比如我点击主页面的一个按钮执行classTs类里的 a 函数,a函数就是在子线程里执行的了

关闭:_myTherad->quit(); _myTherad->wait();delete  ts ;

 

qt使用数据库:

1.使用的编译器是 MinGM 或 MSVxx系统:一般MinGM在include环节没有问题,MSV的话有可能需要自己添加一下

2.安装qt的时候没有勾选上qsqldatabase,那么需要自己下载一个 libmysql.dll (https://pan.baidu.com/s/1UyCyhsER_GPMY6dWmcsCdw; hcvi) 放到 bin 目录(其它目录的话要自己加配置 INCLUDEPATH += 或者 LIBS += )

 3. QT +=  sql

#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariantList>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 查看qt支持的数据口驱动
    //qDebug() << QSqlDatabase::drivers(); // ("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setUserName("root");
    db.setPassword("2580");
    db.setDatabaseName("a");
    if(!db.open()){qDebug() << "打开数据库失败" << db.lastError().text() ; return;}
    else qDebug() << "打开数据库成功";


    QSqlQuery query;

    // 创建表
    // query.exec("create table student(id int primary key auto_increment, name varchar(255),age int,score int)");

    // 插入数据
    //query.exec("insert into student(id, name,age,score) values(8,'zz',22,90)");

    // 批量插入数据,使用预处理execBatch()
    /*query.prepare("insert into student(name,age,score) values(?,?,?)");
    QVariantList nameList;  nameList << "bb" << "cc" << "dd";
    QVariantList ageList;   ageList << 11 << 22 << 33;
    QVariantList scoreList; scoreList << 99 << 98 << 97;
    query.addBindValue(nameList); query.addBindValue(ageList); query.addBindValue(scoreList);
    query.execBatch();*/

    // 开启事务(表示往后的操作都可以撤销)。如果1和3一起执行则表示要删除成员bb,但是又取消了,故不操作。1和2一起执行则表示要删除成员bb,并且确认删除故会删除bb
    /*// 1
    QString sql = QString("delete from student where name = '%1'").arg("bb");
    QSqlDatabase::database().transaction(); //开启一个事务 QSqlDatabase::database()可以获取当前操作的是哪个数据库,不需要全局
    query.exec(sql);

    // 2
    // QSqlDatabase::database().commit();

    // 3
    QSqlDatabase::database().rollback();*/

    // 查找数据
    query.exec("select * from student where name = 'aa' ");
    while(query.next()){ // 一行一行的遍历
//        qDebug() << query.value("id").toInt()
//                 << query.value("name").toString()
//                 << query.value("age").toInt()
//                 << query.value("score").toInt();
        qDebug() << query.value(0).toInt()
                 << query.value(1).toString()
                 << query.value(2).toInt()
                 << query.value(3).toInt();
    }

}

Widget::~Widget()
{
    delete ui;
}
数据库操作代码示例

 

posted @ 2022-08-28 17:07  封兴旺  阅读(159)  评论(0编辑  收藏  举报

联系方式: 18274305123(微信同号)