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; }
数据库操作代码示例

 


__EOF__

本文作者封兴旺
本文链接https://www.cnblogs.com/fxw1/p/16633107.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   封兴旺  阅读(173)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!

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

点击右上角即可分享
微信分享提示