今天使用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次线程连接数据库相关推荐

  1. Qt中线程的生命期问题

    文章目录 1 Qt中线程的生命期问题 1.1 Qt中线程的生命期问题 1.2 同步型线程设计 1.3 在异步型线程设计 1 Qt中线程的生命期问题 1.1 Qt中线程的生命期问题 一个工程中实际的问题 ...

  2. Qt之线程同步(生产者消费者模式 - QSemaphore)

     简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,此时,它将从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Semaphore(信号量) 比 mutex(互斥量)有 ...

  3. Qt之线程同步(生产者消费者模式 - QWaitCondition)

     简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Wait condition(等待条件)比单独使用 mut ...

  4. QT不同线程间signal-slot机制的值传递

    QT不同线程间signal-slot机制的值传递 signal-slot机制是QT核心,也是QT解决线程之间通信的一大亮点.深刻理解其两大特性: (1)loosely coupled sender与r ...

  5. Qt创建线程两种方式的区别

    使用QT创建线程有两种方式,方式A使用moveToThread,方式B是直接继承QThread.差异主要在于方式A的槽函数将会在新线程中运行,而方式B的槽函数在旧线程中运行. 结论如下: PS:旧线程 ...

  6. Qt次线程向主程序发送信号收不到的问题

    问题的提出: Qt次线程向主程序发送信号收不到,信号槽connect返回也是true,排查原因如下: 信号或槽函数中的参数用到了自定义类型,如果要在Qt信号槽中使用自定义类型,需要注意使用qRegis ...

  7. Qt之线程的使用(moveToThread方式)

    一.本文介绍Qt线程的另一个使用方式,也是Qt官方推荐的方式,即moveToThread方式,楼主的理解就是,就是将这个线程使用方式[Qt之线程的使用(继承QThread重写run函数)]中run函数 ...

  8. QT子线程实现串口通信_学习记录

    QT子线程实现串口通信_学习记录 1 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容 ...

  9. QT子线程与主线程的信号槽通信

    最近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号 ...

最新文章

  1. linux驱动:音频驱动(三)ASoc之machine驱动及card初始化
  2. How good software makes us stupid?
  3. 【模板/经典题型】FWT
  4. linux目录和文件管理命令
  5. PHP创建圆柱体的类,创建一个类
  6. (21)FPGA资源共享
  7. Win10中docker安装nuget服务器及使用
  8. java+tomcat(apr,native)
  9. VC++如何根据进程名获取进程ID
  10. html超链接能post吗,通过html超链接进行POST
  11. cmake:execute_process
  12. UVA Team Queue
  13. 什么是 SQL 注入速查表
  14. 华为Mate40 Pro/Pro+正式发布 价格曝光
  15. 【计算机视觉】OpenCV实现单目相机标定
  16. Yao‘s GC 的通信最优解:Half Gate
  17. Verilog HDL学习笔记
  18. 基于webmagic的种子网站爬取
  19. Redis-PHP实战篇——常用的使用场景
  20. L4 详解centos7 emergency模式,rescue模式,linux相互登录,克隆

热门文章

  1. luoguP1090 合并果子 (贪心+优先队列)
  2. git删除某次提交(某个commit)的方法【转】
  3. HTML - label (转)
  4. ubuntu16.04 安装apache2报错 解决方案
  5. 深入浅出MFC学习笔记
  6. [转]在EntityFramework6中执行SQL语句
  7. Xadmin 常用插件
  8. linux下socket调试,linux 下的socket 调试工具 netcat 使用
  9. Selenium自动化测试系列文章汇总
  10. AttributeError: ‘SMOTE’ object has no attribute ‘fit_sample’