QT次线程连接数据库
今天使用Qt的次线程来连接数据库
思路: 1.初始化的时候首先调用次线程初始化数据库2.初始化QSqlTabelModel等3.使用到数据库的地方要验证数据库句柄,如果已失效,要再次调用次线程.
遇到一些问题
1.connect不识别QSqlDatabase类型,要使用qRegisterMetaType注册. 2.如果使用了QSqlTableModel,要在数据库连接成功后初始化.
头文件
#ifndef THREAD_H #define THREAD_H#include <QThread> #include <QtSql/QSqlDatabase> #include <QtSql/QSqlError> #include "config.h"class Thread : public QThread {Q_OBJECTpublic:Thread();~Thread();void stop();QSqlDatabase dbhandle;bool correct;QString returncode; signals:void execresult(QSqlDatabase db,bool correct = true,QString returncode = ""); protected:void run(); };#endif // THREAD_H
源文件
#include "thread.h"Thread::Thread() {this->correct = false;this->returncode = ""; }void Thread::run() {dbhandle = QSqlDatabase::addDatabase("QMYSQL");dbhandle.setHostName(DB_ADDR);dbhandle.setUserName(DB_USER);dbhandle.setPassword(DB_PASS);dbhandle.setPort(DB_PORT);dbhandle.setDatabaseName(DB_DB);if(dbhandle.open())this->correct = true;else{this->correct = false;this->returncode = dbhandle.lastError().text();}this->stop(); }void Thread::stop() {emit execresult(dbhandle,correct,returncode); }Thread::~Thread() {}
槽函数
void Cafes_Income::init_db_return(QSqlDatabase db, bool correct, QString errorstr) {initdbdialog->close();if(!correct){QMessageBox::information(this,tr("数据库初始化失败!"),errorstr);exit(EXIT_FAILURE);}this->dbhandle = db; }
使用数据库的地方
if(!dbhandle.isValid())this->init_database_link();
init_database_link
/** 名称:init_database_link* 作用:初始化数据库链接* 参数:no* 返回:void*/ void Cafes_Income::init_database_link() {if(!dbhandle.isOpen()){this->initdb->start();initdbdialog->exec();} }
转载于:https://www.cnblogs.com/justwake/archive/2013/06/04/3117530.html
QT次线程连接数据库相关推荐
- Qt中线程的生命期问题
文章目录 1 Qt中线程的生命期问题 1.1 Qt中线程的生命期问题 1.2 同步型线程设计 1.3 在异步型线程设计 1 Qt中线程的生命期问题 1.1 Qt中线程的生命期问题 一个工程中实际的问题 ...
- Qt之线程同步(生产者消费者模式 - QSemaphore)
简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,此时,它将从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Semaphore(信号量) 比 mutex(互斥量)有 ...
- Qt之线程同步(生产者消费者模式 - QWaitCondition)
简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Wait condition(等待条件)比单独使用 mut ...
- QT不同线程间signal-slot机制的值传递
QT不同线程间signal-slot机制的值传递 signal-slot机制是QT核心,也是QT解决线程之间通信的一大亮点.深刻理解其两大特性: (1)loosely coupled sender与r ...
- Qt创建线程两种方式的区别
使用QT创建线程有两种方式,方式A使用moveToThread,方式B是直接继承QThread.差异主要在于方式A的槽函数将会在新线程中运行,而方式B的槽函数在旧线程中运行. 结论如下: PS:旧线程 ...
- Qt次线程向主程序发送信号收不到的问题
问题的提出: Qt次线程向主程序发送信号收不到,信号槽connect返回也是true,排查原因如下: 信号或槽函数中的参数用到了自定义类型,如果要在Qt信号槽中使用自定义类型,需要注意使用qRegis ...
- Qt之线程的使用(moveToThread方式)
一.本文介绍Qt线程的另一个使用方式,也是Qt官方推荐的方式,即moveToThread方式,楼主的理解就是,就是将这个线程使用方式[Qt之线程的使用(继承QThread重写run函数)]中run函数 ...
- QT子线程实现串口通信_学习记录
QT子线程实现串口通信_学习记录 1 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容 ...
- QT子线程与主线程的信号槽通信
最近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号 ...
最新文章
- linux驱动:音频驱动(三)ASoc之machine驱动及card初始化
- How good software makes us stupid?
- 【模板/经典题型】FWT
- linux目录和文件管理命令
- PHP创建圆柱体的类,创建一个类
- (21)FPGA资源共享
- Win10中docker安装nuget服务器及使用
- java+tomcat(apr,native)
- VC++如何根据进程名获取进程ID
- html超链接能post吗,通过html超链接进行POST
- cmake:execute_process
- UVA Team Queue
- 什么是 SQL 注入速查表
- 华为Mate40 Pro/Pro+正式发布 价格曝光
- 【计算机视觉】OpenCV实现单目相机标定
- Yao‘s GC 的通信最优解:Half Gate
- Verilog HDL学习笔记
- 基于webmagic的种子网站爬取
- Redis-PHP实战篇——常用的使用场景
- L4 详解centos7 emergency模式,rescue模式,linux相互登录,克隆
热门文章
- luoguP1090 合并果子 (贪心+优先队列)
- git删除某次提交(某个commit)的方法【转】
- HTML - label (转)
- ubuntu16.04 安装apache2报错 解决方案
- 深入浅出MFC学习笔记
- [转]在EntityFramework6中执行SQL语句
- Xadmin 常用插件
- linux下socket调试,linux 下的socket 调试工具 netcat 使用
- Selenium自动化测试系列文章汇总
- AttributeError: ‘SMOTE’ object has no attribute ‘fit_sample’