一、适用场景
适合于可能被整个工程任意处被使用,且不必要被重复创建的场景。例如数据库相关、接收信息相关的类。
单例线程会在首次使用时被创建和初始化,不需要手动创建。
二、编写以下以数据库单例线程为例子
单例线程本质上还是线程,所以继承于QThread,头文件要包含<QThread>。
.h文件
#ifndef DATABASETHREAD_H
#define DATABASETHREAD_H
#include <QThread>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
class DatabaseThread : public QThread{
Q_OBJECT
public:
explicit DatabaseThread(QObject *parent = nullptr);
static DatabaseThread *Instance(){
if(!s_DatabaseThread){
s_DatabaseThread = new DatabaseThread;
}
return s_DatabaseThread;
}
static void deleteInstance(){
if(s_DatabaseThread){
s_DatabaseThread->quit();
s_DatabaseThread->wait();
s_DatabaseThread->deleteLater();
s_DatabaseThread = Q_NULLPTR;
}
}
void testfunction();//数据库使用相关的函数可在此声明
private:
static DatabaseThread *s_DatabaseThread;
QSqlDatabase db;
};#endif // DATABASETHREAD_H
.cpp文件
DatabaseThread *DatabaseThread::s_DatabaseThread = 0;
DatabaseThread::DatabaseThread(QObject *parent) : QThread(parent){
if(QSqlDatabase::contains("Data"))
db = QSqlDatabase::database("Data");
else
db = QSqlDatabase::addDatabase("QSQLITE","Data");
db.setDatabaseName("Liquidflash.db3");
db.open();
}
三、使用
单例线程不需要手动创建或初始化,在使用的类中包含一下#include “databasethread.h”
然后直接按以下方式调用方法:
DatabaseThread::Instance()->testfunction();
不需要担心由于没有手动创建和初始化导致的单例构造函数不执行,单你首次使用到单例线程时(无论是调用其中哪个函数),都会自动先执行构造函数。
适合于可能被整个工程任意处被使用,且不必要被重复创建的场景。例如数据库相关、接收信息相关的类。
单例线程会在首次使用时被创建和初始化,不需要手动创建。
二、编写以下以数据库单例线程为例子
单例线程本质上还是线程,所以继承于QThread,头文件要包含<QThread>。
.h文件
#ifndef DATABASETHREAD_H
#define DATABASETHREAD_H
#include <QThread>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
class DatabaseThread : public QThread{
Q_OBJECT
public:
explicit DatabaseThread(QObject *parent = nullptr);
static DatabaseThread *Instance(){
if(!s_DatabaseThread){
s_DatabaseThread = new DatabaseThread;
}
return s_DatabaseThread;
}
static void deleteInstance(){
if(s_DatabaseThread){
s_DatabaseThread->quit();
s_DatabaseThread->wait();
s_DatabaseThread->deleteLater();
s_DatabaseThread = Q_NULLPTR;
}
}
void testfunction();//数据库使用相关的函数可在此声明
private:
static DatabaseThread *s_DatabaseThread;
QSqlDatabase db;
};#endif // DATABASETHREAD_H
.cpp文件
DatabaseThread *DatabaseThread::s_DatabaseThread = 0;
DatabaseThread::DatabaseThread(QObject *parent) : QThread(parent){
if(QSqlDatabase::contains("Data"))
db = QSqlDatabase::database("Data");
else
db = QSqlDatabase::addDatabase("QSQLITE","Data");
db.setDatabaseName("Liquidflash.db3");
db.open();
}
三、使用
单例线程不需要手动创建或初始化,在使用的类中包含一下#include “databasethread.h”
然后直接按以下方式调用方法:
DatabaseThread::Instance()->testfunction();
不需要担心由于没有手动创建和初始化导致的单例构造函数不执行,单你首次使用到单例线程时(无论是调用其中哪个函数),都会自动先执行构造函数。