QML、数据库、单例模式

单例

`

单例模式基础使用:

#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注册单例模式:
在这里插入图片描述


提供先进的推理,复杂的指令,更多的创造力。
详细请看:工程链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值