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。
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
