QT -20230709

news2024/11/16 7:49:14

练习:

登录界面增加注册功能(在本地增加用户文件进行比对用户)

LoginWindow.h

#ifndef LOGINWINDOW_H
#define LOGINWINDOW_H

#include <QMainWindow>
#include <QIcon>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QDebug>
#include <QMessageBox>
#include <QFile>

class LoginWindow : public QMainWindow
{
    Q_OBJECT

signals:
    void pushToHomeWindow();

public slots:
    void loginButtonEvent();
    void registerEvent();

public:
    LoginWindow(QWidget *parent = 0);
    ~LoginWindow();

private:
    QLineEdit *usernameInput;
    QLineEdit *passwdInput;
};

#endif // LOGINWINDOW_H

LoginWindow.cpp

#include "loginwindow.h"

const QString USER_TABLE_PATH = "./userTable.txt";

void showAlert(QString msg) {
    QMessageBox::information(nullptr, "提醒", msg);
}

LoginWindow::LoginWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(600, 800);

    this->setWindowIcon(QIcon(":/images/QQ.png"));
    this->setWindowTitle("登录界面");
    this->setStyleSheet("background-color:white");

    int offsetX = (this->width()-480)/2, offsetY = 10;

    //LOGO
    QLabel *logoLabel = new QLabel(this);
    logoLabel->setPixmap(QPixmap(":/images/logo.png"));
    logoLabel->setGeometry(offsetX, offsetY, 480, 266);
    offsetY += (266 + 20);

    //登录框
    offsetX = (this->width()-260)/2;
    QLabel *loginIcon = new QLabel(this);
    loginIcon->setPixmap(QPixmap(":/images/userName.jpg"));
    loginIcon->setScaledContents(true);
    loginIcon->setGeometry(offsetX, offsetY, 50, 50);
    offsetX += (50+10);

    QLineEdit *usernameInput = new QLineEdit(this);
    this->usernameInput = usernameInput;
    usernameInput->setPlaceholderText("请输入用户名");
    usernameInput->setGeometry(offsetX, offsetY, 200, 50);
    usernameInput->setStyleSheet("border:none");

    QWidget *loginBottomLine = new QWidget(this);
    loginBottomLine->setStyleSheet("background-color:black");
    loginBottomLine->setGeometry(usernameInput->x(), usernameInput->y()+usernameInput->height(), usernameInput->width(), 1);
    offsetY += (50+10);

    offsetX = (this->width()-260)/2;
    QLabel *passwdIcon = new QLabel(this);
    passwdIcon->setPixmap(QPixmap(":/images/passwd.jpg"));
    passwdIcon->setScaledContents(true);
    passwdIcon->setGeometry(offsetX, offsetY, 50, 50);
    offsetX += (50+10);

    QLineEdit *passwdInput = new QLineEdit(this);
    this->passwdInput = passwdInput;
    passwdInput->setPlaceholderText("请输入密码");
    passwdInput->setGeometry(offsetX, offsetY, 200, 50);
    passwdInput->setEchoMode(QLineEdit::Password);
    passwdInput->setStyleSheet("border:none");

    QWidget *passwdBottomLine = new QWidget(this);
    passwdBottomLine->setStyleSheet("background-color:black");
    passwdBottomLine->setGeometry(passwdInput->x(), passwdInput->y()+passwdInput->height(), passwdInput->width(), 1);
    offsetY += 60;

    //登录按钮
    offsetX = (this->width()-150)/2;
    QPushButton *loginBtn = new QPushButton(this);
    loginBtn->setIcon(QIcon(":/images/login.png"));
    loginBtn->setText("登录");
    loginBtn->setIconSize(QSize(20, 20));
    loginBtn->setGeometry(offsetX, offsetY, 80, 44);
    connect(loginBtn, &QPushButton::clicked, this, &LoginWindow::loginButtonEvent);
    offsetX += (80 + 20);

    //取消按钮
    QPushButton *cancelBtn = new QPushButton(this);
    cancelBtn->setIcon(QIcon(":/images/cancel.png"));
    cancelBtn->setText("取消");
    cancelBtn->setIconSize(QSize(20, 20));
    cancelBtn->setGeometry(offsetX, offsetY, 80, 44);
    connect(cancelBtn, &QPushButton::clicked, [=]() {
        //取消按钮点击事件
        int res = QMessageBox::question(this, "提醒", "是否要退出登录", QMessageBox::Yes | QMessageBox::No);
        if (res == QMessageBox::Yes) {
            this->close();
        }
    });
    offsetX += (80 + 20);

    //注册
    QPushButton *registerBtn = new QPushButton(this);
    registerBtn->setText("注册");
    registerBtn->setGeometry(offsetX, offsetY, 80, 44);
    connect(registerBtn, &QPushButton::clicked, this, &LoginWindow::registerEvent);

    offsetY += 70;

    this->resize(this->width(), offsetY);
}

bool checkUser(QString username, QString passwd) {
    QFile file(USER_TABLE_PATH);
    if (!file.exists()) {
        showAlert("登录失败");
        return false;
    }
    if (!file.open(QFile::ReadOnly)) {
        showAlert("打开用户表失败");
        return false;
    }
    while(!file.atEnd()) {
        QByteArray byteArray = file.readLine();
        QString orgStr = QString(byteArray);
        QStringList list = orgStr.split(" ");
        QString tempUsername = list[0];
        QString tempPasswd = list[1];
        tempPasswd.remove(tempPasswd.size()-1, 1);
        if (tempUsername == username && tempPasswd == passwd) {
            return true;
        }
    }
    return false;
}

void LoginWindow::loginButtonEvent() {
    //登录事件
    if (checkUser(this->usernameInput->text(), this->passwdInput->text())) {
        QMessageBox box(QMessageBox::Information, "提醒", "登录成功", QMessageBox::Ok, this);
        //box.button(QMessageBox::Ok)->setText("aaa");
        int res = box.exec();
        if (res == QMessageBox::Ok) {
            qDebug() << "登录成功";
            emit pushToHomeWindow();
            this->close();
        }
    } else {
        int res = QMessageBox::warning(this, "提醒", "账号密码不匹配,是否重新登录?", QMessageBox::Ok | QMessageBox::Cancel);
        if (res == QMessageBox::Ok) {
            this->passwdInput->setText("");
        } else if (res == QMessageBox::Cancel) {
            this->close();
        }
    }
}

//注册事件
void LoginWindow::registerEvent() {
    if (this->usernameInput->text().length() <= 0 || this->passwdInput->text().length() <= 0) {
        showAlert("请输入用户名和密码");
        return;
    }
    QFile file(USER_TABLE_PATH);

    QString username = this->usernameInput->text();
    QString passwd = this->passwdInput->text();

    QString res = username + " " + passwd + "\n";
    if (!file.open(QFileDevice::Append)) {
        showAlert("打开文件失败");
        return;
    }
    file.write(res.toLocal8Bit().data());

    showAlert("注册成功");
}

LoginWindow::~LoginWindow()
{

}

结果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP Socket性能优化秘籍:掌握read、recv、readv、write、send、sendv的最佳实践

TCP Socket性能优化秘籍&#xff1a;掌握read、recv、readv、write、send、sendv的最佳实践 博主简介一、引言1.1、TCP Socket在网络通信中的重要性1.2、为什么需要优化TCP Socket的性能&#xff1f; 二、TCP Socket读操作的性能优化2.1、read、recv、readv的功能和用法2.2、提…

有哪些做的问卷调查的工具?

想要洞察市场变化、了解某个特定群体的喜好等情况&#xff0c;使用问卷调查是常见的方法。而互联网的发展&#xff0c;越来越多的人转战网络问卷&#xff0c;而功能各异的问卷工具却让人挑花眼。今天&#xff0c;我们精准针对大家的需求和常见的一些问题&#xff0c;为大家聊一…

ASPICE汽车软件能力如何评估

第一节我们介绍了&#xff1a;什么是ASPICE 上一节我们介绍了&#xff1a;什么是aspice认证 这一节我们看一看&#xff1a;ASPICE汽车软件能力是如何评估 为了使汽车电控系统的研发具有统一的流程和规范的标准&#xff0c;并且使整个开发进度具有可控性和可预测阻借用具有国际…

利用Anaconda完成Python环境安装及配置

1 Anaconda 1.1 配置过程 Anaconda是一个开源的Python和R编程语言的软件包管理器和环境管理器&#xff0c;用于数据科学和机器学习的开发。 进入官网https://www.anaconda.com/下载安装包next->argee进入下列界面&#xff0c;选择Just Me 选择安装路径&#xff0c;点击Ne…

Swagger-Bootstrap-UI

Swagger-Bootstrap-UI 是一个为 Swagger 提供美观、易用的界面展示和增强功能的开源项目。它通过自定义样式和交互&#xff0c;提供了更好的文档展示和交互体验&#xff0c;包括美化的界面、接口测试工具、在线调试、文档导出等功能。 更高阶的有Knife4j,Knife4j是一个集Swagg…

本地部署 ChatPPT

本地部署 ChatPPT 1. 什么是 ChatPPT2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 ChatPPT6. 运行 ChatPPT 1. 什么是 ChatPPT ChatPPT由chatgpt提供支持&#xff0c;它可以帮助您生成PPT/幻灯片。支持中英文输出。 2. Github 地址 https://github.com/huimi24/…

CS制作office宏文档钓鱼

前言 书接上文&#xff0c;CobaltStrike_1_部署教程&#xff0c;改篇介绍【CS制作office宏文档钓鱼】。PS&#xff1a;文章仅供学习使用&#xff0c;不做任何非法用途&#xff0c;后果自负&#xff01; 一、CobaltStrike 4.X安装部署 部署安装之前的文章已经介绍过了&#xf…

一个自定义中间放大CollectionViewLayout

效果图如下 思路&#xff1a; 根据cell距离屏幕中间的距离&#xff0c;设置cell的缩小系数&#xff0c;并通过设置 attributes.transform 缩小cell attributes.transform CGAffineTransformMakeScale(1.0, scale); 核心代码 // // LBMiddleExpandLayout.m // LiuboMiddle…

微服务之服务器缓存

Informal Essay By English In the difficult employment situation, we need to set a good goal and then do our own thing 参考书籍&#xff1a;“凤凰架构” 进程缓存&#xff08;Cache&#xff09; 缓存在分布式系统是可选&#xff0c;在使用缓存之前需要确认你的系统…

Elasticsearch【集群概念、搭建集群】(七)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch集群_概念 Elasticsearch集群_搭建集群 Elasticsearch集群_概念 在单台ES服务器上&#xff0c;随着一个索引内数据的增多&#xff0c;会产生存储、效率、安全等问题。 1、假设项目中有一个500G大小的索引&#xff0c;但我们只有几台200G硬盘 的服务器&am…

Debezium日常分享系列之:流式传输 Cassandra

Debezium日常分享系列之&#xff1a;流式传输 Cassandra 一、批量 ETL 选项二、流媒体选项三、Kafka 作为事件源四、解析提交日志五、提交日志深入探讨1.延迟处理2.空间管理3.重复的事件4.无序事件5.带外架构更改6.行数据不完整 六、最低限度可行的基础设施1.无状态流处理2.有状…

45. 跳跃游戏 II (贪心)

题目链接&#xff1a;力扣 解题思路&#xff1a;贪心&#xff0c;尽可能地找到下一跳能够跳到的最远距离&#xff0c;这样到达终点时&#xff0c;所需跳跃次数最少 以nums [2,3,1,1,4,2]为例&#xff1a; 以当前位置begin作为起跳点&#xff0c;能够跳跃的最远距离为m&#…

影视剧配音软件哪个好?几款好用的影视剧配音软件推荐

影视剧配音软件哪个好&#xff1f;几款好用的影视剧配音软件推荐 我们日常刷短视频的时候&#xff0c;经常会刷到一些影视剧相关的作品&#xff0c;特别是一些大热剧及经典剧&#xff0c;很多创作者都喜欢融入自己的解读&#xff0c;进行一些加工&#xff0c;形成一部的独一无…

STM32 Mac开发环境Clion+STM32CubeMX+ST-Link-V2

STM32 Mac开发环境ClionSTM32CubeMXST-Link-V2 也不知道什么时候买的stm32板吃灰太久&#xff0c;不会玩&#xff0c;环境之前都没搞定&#xff0c;今天又折腾一天终于可以点灯了。 安装编译器gcc brew tap ArmMbed/homebrew-formulae brew install arm-none-eabi-gccOPEN-O…

Qt提取excel表单中数据

这是一个excel表单&#xff0c;目标是把其中的数据提取出来。 文章学习自&#xff1a;QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中_qt将excel表格中指定范围内容显示在界面中_Jessica_1409573408的博客-CSDN博客 程序如下&…

前端CSS

基础语法 /*CSS注释 */ CSS样式 CSS应用方式 内联式 在标签上写样式 <img src"..." style"height:100px" /><div style"color:red;">中国联通</div> 嵌入式 在head标签中写style标签 外联式 样式写到文件中&#xff0…

网页链接投票链接步骤公众号投票链接制作制作投票

大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星”投票小程…

语言模型BERT理解

一、BERT概述 BERT是由Google在2018年提出的一种预训练语言模型。BERT的创新之处在于采用了双向Transformer编码器来生成上下文相关的词向量表示。 传统的单向语言模型只考虑了左侧或右侧的上下文信息&#xff0c;而BERT则同时考虑了左侧和右侧的上下文信息&#xff0c;使得生…

YOLOv5改进系列(15)——增加小目标检测层

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

手把手教您kaiber,吊炸天的AI视频生成工具

什么是Kaiber AI&#xff1f; 一种人工智能视频生成器&#xff0c;可以将图像和文字生成视频。 如何使用Kaiber AI&#xff1f; 请按照以下步骤使用 Kaiber AI&#xff1a; 前往kaiber ai注册或登录。点击右上角“创建视频”。 如果订阅的时候提示要绑定银行卡&#xff0c;则找…