码上通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。

复制代码
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript