单例
`
单例模式基础使用:
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QObject>
#include "dbmanagement.h"
#include"modeluserinfo.h"
#include"QtDebug"
class Global : public QObject
{
Q_OBJECT
//用户管理
Q_PROPERTY(ModelUserInfo *userInfoList READ userInfoList NOTIFY userInfoListChanged)
Q_PROPERTY(int userListLength READ userListLength NOTIFY userListLengthChanged)
Q_PROPERTY(QStringList userNameList READ userNameList NOTIFY userNameListChanged)
public:
void init();
// 全局单例
static Global *instance();
ModelUserInfo *userInfoList() { return m_userInfoModel; };
int userListLength() { return m_userInfoModel->rowCount(); };
QStringList userNameList() { return m_userNameList; }
//用户管理model
ModelUserInfo *m_userInfoModel;
// 用户管理
QStringList m_userNameList;
QList<CommonDefines::UserInfo> m_userInfoList;
public:
DbManagement *dbMgt() { return m_pDb; }
// 用户管理
bool getUserInfoList();
Q_INVOKABLE void getUserList(); // 查询用户列表
Q_INVOKABLE bool newUser(QString strUserName, QString strPassword); // 新建用户
Q_INVOKABLE bool setKeepPassword(QString strName, bool bEnabled); // 记住密码设置
Q_INVOKABLE QString getUserPassword(int id); // 查询用户密码,用于登录检验和密码自动输入
Q_INVOKABLE QString getUserPassword(QString strName); // 查询用户密码,用于用户管理界面的密码显示
Q_INVOKABLE bool updateUserName(QString strOldName, QString strNewName); // 修改用户名,用于用户管理界面
Q_INVOKABLE bool updateUserPassword(QString strUserName, QString strNewPassword); // 修改密码,用于用户管理界面
Q_INVOKABLE bool updateUserInfo(int id, QString strUserName, QString strPassword); // 修改用户名和密码,用于高级用户管理界面的信息修改
Q_INVOKABLE bool deleteUserInfo(int id); // 删除用户
Q_INVOKABLE bool findNewUserName(QString strName); // 查询新用户名是否存在,用于新建用户
Q_INVOKABLE bool checkNewUserName(int index, QString strName); // 查询新用户名是否存在,用于修改用户名
private:
explicit Global(QObject *parent = nullptr);
signals:
void userInfoListChanged();
void userListLengthChanged();
void userNameListChanged();
private:
// 全局单例
static Global *m_pInstance;
DbManagement *m_pDb;
};
#endif // GLOBAL_H
```cpp
#include "global.h"
Global *Global::m_pInstance = nullptr;
Global::Global(QObject *parent) : QObject(parent)
{
}
Global *Global::instance()
{
if (nullptr == m_pInstance)
{
m_pInstance = new Global();
}
return m_pInstance;
}
void Global::init()
{
m_pDb = new DbManagement();
m_userInfoModel = new ModelUserInfo;
connect(m_userInfoModel, &QAbstractListModel::modelReset, [=]() {
qDebug() << __FUNCTION__ << "userListLengthChanged";
emit userListLengthChanged();
});
getUserList();
m_userInfoModel->updateModel();
emit userInfoListChanged();
}
数据库
基础数据库类
#ifndef DBMANAGEMENT_H
#define DBMANAGEMENT_H
#include <QObject>
#include <QMap>
#include <QSqlDatabase>
#include <commonDefines.h>
class DbManagement : public QObject
{
Q_OBJECT
public:
explicit DbManagement(QObject *parent = nullptr);
private:
bool init();
void initCreateSql();
void checkTable();
void createTable(const QString &strTableName);
void initTableContents();
public:
// 用户管理
bool saveUser(CommonDefines::UserInfo &userInfo);
bool queryUserInfoList(QList<CommonDefines::UserInfo> &userInfoList);
bool getUserCount(int &iCount);
bool queryAdminPw(QString &strPassword);
bool updateAdminPw(QString strPassword);
private:
QString m_strDbPath;
QSqlDatabase m_db;
QMap<QString, QString> m_mapTableSql;
};
#endif // DBMANAGEMENT_H
```cpp
#include "dbmanagement.h"
#include <QDebug>
#include <QFile>
#include <QSqlQuery>
#include <QSqlError>
DbManagement::DbManagement(QObject *parent)
: QObject(parent)
{
#ifndef QT_DEBUG
m_strDbPath = "/home/root/app/ui/test.db";
#else
m_strDbPath = "test.db";
#endif
initCreateSql();
init();
}
bool DbManagement::init()
{
if (m_db.isOpen())
{
return true;
}
if (!QFile::exists(m_strDbPath))
{
qDebug() << "DB is not exists, will be created.";
}
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(m_strDbPath);
if (!m_db.open())
{
qDebug() << "Failed to open db file: " << m_db.databaseName();
qDebug() << "db ??? ";
return false;
}
checkTable();
return true;
}
void DbManagement::initCreateSql()
{
// 用户信息
m_mapTableSql.insert("user_info", "CREATE TABLE [user_info]([user_id] INT PRIMARY KEY NOT NULL UNIQUE, [user_name] TEXT NOT NULL, [password] TEXT NOT NULL, "
"[create_time] DATETIME, [modify_time] DATETIME, [isDeleted] BOOL DEFAULT False, [isKeepPassword] BOOL DEFAULT False);");
}
void DbManagement::checkTable()
{
QStringList tables = m_db.tables();
for (QMap<QString, QString>::const_iterator it = m_mapTableSql.begin(); it != m_mapTableSql.end(); ++it)
{
if (!tables.contains(it.key()))
{
createTable(it.key());
}
}
if (!tables.contains("user_info"))
{
initTableContents();
}
Model
#ifndef MODELUSERINFO_H
#define MODELUSERINFO_H
#include <QAbstractListModel>
#include "commonDefines.h"
class ModelUserInfo : public QAbstractListModel
{
Q_OBJECT
public:
enum EnumUserInfo
{
UserId = Qt::UserRole,
UserName,
Password,
CreateTime
};
Q_ENUM(EnumUserInfo)
explicit ModelUserInfo(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
Q_INVOKABLE void updateModel();
protected:
QHash<int, QByteArray> roleNames() const;
private:
QList<CommonDefines::UserInfo> m_userInfoList;
};
#endif // MODELUSERINFO_H
QML和C++交互
QML注册单例模式:
详细请看:工程链接