码上通QT实战03--登录逻辑

1、前言

在QT项目开发过程中,设计系统登录界面可以使用QT框架来实现。以下是一个简单的系统登录界面设计示例:

创建登录界面UI:可以使用QT Designer来设计登录界面的UI,包括用户名输入框、密码输入框、登录按钮等。在QT Designer中,可以直观地拖放控件来设计界面布局。

实现登录功能:在C++中,可以通过连接信号与槽的方式实现登录功能。当用户点击登录按钮时,可以连接按钮的clicked信号与相应的槽函数,用于验证用户名密码是否正确。

用户验证:在槽函数中,可以获取用户名密码输入框中的文本内容,并与预先设置的用户名密码进行比对。如果用户名密码正确,可以跳转到系统主界面;如果不正确,可以提示用户重新输入。

界面美化:可以使用QT的样式表来美化界面,包括设置背景颜色、字体样式、按钮样式等

2、开始实现

1、sqlite3介绍

SQLite3 是一款轻量级、嵌入式的关系型数据库引擎,无需单独的服务器进程,直接通过本地文件存储数据。它以库的形式提供,支持标准的 SQL 语法,适用于嵌入式设备、移动应用和小型项目。SQLite3 的简洁性和便携性使其成为开发测试和轻量级应用的理想选择。

核心特点

  • 零配置:无需安装或管理,直接集成到应用程序中。
  • 单文件存储:所有数据(表、索引等)保存在单个跨平台文件中。
  • 无服务器架构:通过库调用直接访问数据库文件,减少资源占用。
  • 事务支持:遵循 ACID(原子性、一致性、隔离性、持久性)原则。

适用场景

  • 移动应用(如 Android、iOS 的本地存储)。
  • 桌面软件(如浏览器缓存、配置存储)。
  • 小型 Web 应用或原型开发。
  • 嵌入式系统和物联网设备

将SQLITE3有关的dll文件放在指定目录下

2、Navicat Premium 15介绍

Navicat Premium 15 是一款数据库管理工具,支持多种数据库系统,包括 MySQL、PostgreSQL、Oracle、SQL Server 和 MariaDB。它提供直观的图形界面,简化数据库开发、管理和维护任务。

主要功能

多数据库支持:支持连接和管理多种数据库类型,无需切换工具。

数据同步与迁移:提供数据同步、结构和数据传输功能,支持跨数据库迁移。

SQL 编辑与调试:内置 SQL 编辑器,支持语法高亮、自动补全和调试。

数据可视化:支持生成图表和报表,便于数据分析。

备份与恢复:提供数据库备份和恢复功能,确保数据安全。

云数据库支持:兼容 AWS RDS、Google Cloud 和阿里云等云数据库服务。
系统要求

操作系统:Windows 7 及以上、macOS 10.13 及以上、Linux(部分发行版)。

硬件:建议 2GB 以上内存和 200MB 可用磁盘空间。
安装与激活

从官网下载对应操作系统的安装包。

运行安装程序并按照向导完成安装。

启动 Navicat Premium 15,输入许可证密钥或试用。
使用技巧

连接数据库:通过"连接"菜单创建新连接,填写主机、端口、用户名和密码。

查询构建器:使用可视化工具构建复杂查询,无需手动编写 SQL。

任务自动化:利用"计划"功能设置定期备份或数据同步任务。

3、创建数据库中的用户表

4、修改项目配置文件

修改项目配置文件,增加对数据库SQLITE3的支持

5、编写槽函数

头文件增加代码

cpp 复制代码
#ifndef LOGINWINDOW_H
#define LOGINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <qevent.h>
#include <systemutils.h>

namespace Ui {
class LoginWindow;
}

class LoginWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit LoginWindow(QWidget *parent = nullptr);
    ~LoginWindow();

private slots:
    void on_pb_close_clicked();

    void on_pb_login_clicked();

private:
    Ui::LoginWindow *ui;
    SystemUtils *utils;
    // 窗口拖动的函数覆写
    bool m_drag, m_move;
    QPoint m_dragPos, m_resizeDownPos;
    QRect m_mouseDownRect;
    void mousePressEvent(QMouseEvent *event) override;//鼠标按下事件
    void mouseMoveEvent(QMouseEvent *event) override;//鼠标移动事件
    void mouseReleaseEvent(QMouseEvent *event) override;//鼠标释放事件
    QSqlDatabase DB;
    QSqlQuery query;

};

#endif // LOGINWINDOW_H

QApplication::applicationDirPath() 函数说明

QApplication::applicationDirPath() 是 Qt 框架中的一个静态函数,用于获取当前应用程序可执行文件所在的目录路径。该函数返回一个 QString 类型的字符串,表示应用程序的安装目录或运行目录。

使用方法

调用该函数无需创建 QApplication 实例,可以直接通过类名调用。例如:

cpp 复制代码
static QString QApplication::applicationDirPath()
cpp 复制代码
QString appDir = QApplication::applicationDirPath();
qDebug() << "Application directory:" << appDir;

返回值说明

  • 返回的路径是应用程序可执行文件所在的目录,通常是绝对路径。
  • 在 Windows 上,路径分隔符为 \;在 Unix/Linux/macOS 上,路径分隔符为 /
  • 如果应用程序是通过符号链接启动的,返回的路径会是符号链接指向的实际路径。

典型应用场景

  • 加载与应用程序同目录的配置文件或资源文件。
  • 定位插件或动态库的存放路径。
  • 构建相对路径时作为基准路径。

注意事项

  • 在多线程环境中,确保在主线程调用此函数,因为 QApplication 相关功能通常需要主线程初始化。
  • 路径可能因打包方式(如 macOS 的 .app 包)而不同,需结合 QCoreApplication::applicationFilePath() 进一步处理。

6、完整代码

cpp 复制代码
#include "loginwindow.h"
#include "mainwindow.h"
#include "ui_loginwindow.h"
#include <systemutils.h>
#include <QGraphicsDropShadowEffect>

LoginWindow::LoginWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::LoginWindow)
{
    ui->setupUi(this);

    this->setWindowFlag(Qt::FramelessWindowHint);//无边框窗口
    this->setAttribute(Qt::WA_TranslucentBackground);//透明窗口

    // //设置渐变阴影
    // QGraphicsDropShadowEffect *effect=new QGraphicsDropShadowEffect();
    // effect->setOffset(0,0);
    // effect->setColor(Qt::gray);//灰色渐变
    // effect->setBlurRadius(10);//阴影有多大
    // ui->wdg_content->setGraphicsEffect(effect);

    // QGraphicsDropShadowEffect *effect2=new QGraphicsDropShadowEffect();
    // effect2->setOffset(0,0);
    // effect2->setColor(Qt::gray);//灰色渐变
    // effect2->setBlurRadius(40);//阴影有多大
    // ui->wdg_logo->setGraphicsEffect(effect2);

     //  设置渐变阴影
    utils=new SystemUtils();
    utils->SetDropShadowEffect(ui->wdg_content,Qt::gray,10);
    utils->SetDropShadowEffect(ui->wdg_logo,Qt::gray,60);


    // 设置相关字体图标
    QFont font=QFont(QString("zx_icons"),12);

    // 关闭
    ui->pb_close->setFont(font);
    ui->pb_close->setText(QChar(0xe653));
    //用户名
    ui->lbl_icon_un->setFont(font);
    ui->lbl_icon_un->setText(QChar(0xe64a));
    //密码
    ui->lbl_icon_pw->setFont(font);
    ui->lbl_icon_pw->setText(QChar(0xe609));

    // 数据库文件加载与初始化
    DB.setHostName("localhost");//设置主机名
    DB=QSqlDatabase::addDatabase("QSQLITE");
    DB.setDatabaseName(QApplication::applicationDirPath()+"/data.db3");
    if(!DB.open()){
        ui->lbl_error->setText("数据库对象初始化失败");
    }
}

LoginWindow::~LoginWindow()
{
    delete ui;
    delete utils;
    // 关闭和移除对应的数据库文件
    QString name=QSqlDatabase::database().connectionName();
    QSqlDatabase::removeDatabase(name);
}


// 按下鼠标左键
void LoginWindow::mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {  // 如果按下左边按钮
        m_drag = true;//表示要移动
        // 获取当前光标的位置
        m_dragPos = event->pos();
        // 当前鼠标点相对于桌面屏幕左上角的坐标(0,0),全局坐标;
        m_resizeDownPos = event->globalPosition().toPoint();
        // 获取当前窗口的相关参数,包括位置,大小等等各种参数
        m_mouseDownRect = this->rect();
    }
}

// 鼠标移动
void LoginWindow::mouseMoveEvent(QMouseEvent *event) {
    // 如果是鼠标在拖动时,当前窗口是全屏,不做任何处理
    if (isFullScreen()) {
        return;
    }
    if (m_move) {
        move(event->globalPosition().toPoint() - m_dragPos);
        return;
    }

    setCursor(Qt::ArrowCursor);
    if (m_drag && (event->buttons() & Qt::LeftButton)) {
        m_move = true;

        move(event->globalPosition().toPoint() - m_dragPos);
    }
}

// 鼠标释放
void LoginWindow::mouseReleaseEvent(QMouseEvent *event) {
    Q_UNUSED(event)
    m_drag = false;
    if (m_move) {
        m_move = false;
    }
    setCursor(Qt::ArrowCursor);
}

//关闭按钮
void LoginWindow::on_pb_close_clicked()
{
     this->close();
}

//登录按钮
void LoginWindow::on_pb_login_clicked()
{

    // 检查用户名/ 密码
    QString un=ui->le_un->text();
    QString pw=ui->le_pw->text();

    // 这里主要是测试时方便,实际发布不要这样
    // un="admin";
     //pw="123456";

    ui->lbl_error->setText("");

    if(un.isEmpty())
    {
        ui->lbl_error->setText("登录用户不能为空");
        return;
    }
    if(pw.isEmpty())
    {
        ui->lbl_error->setText("登录密码不能为空");
        return;
    }
    bool openflag=DB.isOpen();
    if(!openflag){
        ui->lbl_error->setText("数据库文件加载失败");
        return;
    }
    // 比对数据库的用户信息   -- Sqlite
    query=QSqlQuery(DB);
    query.clear();
    //准备SQL语句
    QString datasql = QString("SELECT * from users where user_name='%1' and password='%2'").arg(un).arg(pw);
    bool success = query.exec(datasql);
    if (success == false) {
        DB.close();  // 网络资源,需要回收
        ui->lbl_error->setText("用户名或密码错误");
        return;
    }
    if (query.next() == false) {
        DB.close(); // 网络资源,需要回收
        ui->lbl_error->setText("用户名或密码错误");
        return  ;
    }


    // 闭关当前登录 窗口   打开主窗口
    MainWindow *mainWindow=new MainWindow();
    mainWindow->show();
    this->close();

}

7、运行测试

3、小结

Qt提供了丰富的UI组件,可以通过Qt Designer或代码方式创建登录界面。典型的登录界面包括用户名输入框、密码输入框、登录按钮和取消按钮,对于更安全的系统,通常需要连接数据库验证用户凭证。存储密码时不应明文存储,应使用哈希算法加密。可以使用QSettings实现记住密码功能。如果需要通过HTTP请求验证用户,可以使用QNetworkAccessManager。

复制代码
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
相关推荐
Alsn862 小时前
29.Java中常见加解密算法的基本实现
java·开发语言·算法
独自破碎E2 小时前
什么是Java的多态特性?
java·开发语言
superman超哥2 小时前
仓颉GC调优参数深度解析
c语言·开发语言·c++·python·仓颉
sandyznb2 小时前
go面试汇总
开发语言·面试·golang
ss2732 小时前
自定义线程池:从工作原理到实战验证
java·开发语言·jvm
leaves falling2 小时前
c语言-三角形判断
c语言·开发语言
疑惑的杰瑞2 小时前
掌握 C 语言流程控制:分支、循环、goto 与表达式求值详解
c语言·开发语言·算法·算术转换
LNN20222 小时前
.NET、C#基础知识学习(1)
开发语言
leiming63 小时前
c++ string 容器
开发语言·c++·算法