Qt Creator创建一个用户登录界面

news2024/11/26 0:54:26

目录

1 界面设计

2 代码

2.1 登录界面

2.2 注册界面

2.3 登陆后的界面

3 完整资源


        这里主要记录了如何使用Qt Creator创建一个用户登录界面,能够实现用户的注册和登录功能,注册的用户信息存储在了一个文件之中,在登录时可以比对登录信息和文件存储信息,已确认用户是否存在,如果不存在也可以通过注册功能进行注册。

1 界面设计

主要分为3个界面:登录界面、注册界面、登录后的界面

2 代码

2.1 登录界面

登录界面命名对于文件为widget.h、widget.c

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <form.h>
#include <form01.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Form *form = new Form();         // define a object
    Form01 *form01 = new Form01();   // Login

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.c

#include "widget.h"
#include "ui_widget.h"
#include "QDebug"
#include "main.h"
#include "QDir"
#include "QMessageBox"

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

    connect(this->form, &Form::BackSig, this, [=](){
       this->form->hide();
       this->show();
    });

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    // this->hide();
    // this->close();
    qDebug() << "Change page to Login";

    // gain context about lineEdit and judge and ...
    QString path = QDir::currentPath(); // 获取当前工程所在路径

    std::string user_pwd;  //
    std::string part1;   // useranme
    std::string part2;   // password
    int flag = 1;

    std::ifstream infile("/root/QT_developer/File/user_table.txt");
        if (!infile.is_open()) {
            std::cerr << "Unable to open file!" << std::endl;
        }//

    std::string line;

    QString In_username = ui->lineEdit->text();
    QString In_password = ui->lineEdit_2->text();
    part1 = In_username.toStdString();
    part2 = In_password.toStdString();
    user_pwd = part1 + ":" + part2;

    if(In_password.isEmpty())
    {
        QMessageBox::information(this, "Tips", "In_password is empty!");
    }else if(In_username.isEmpty())
    {
        QMessageBox::information(this, "Tips", "In_usename is empty!");
    }else
    {
        while (std::getline(infile, line)) {  // gain data on a line
            if(user_pwd == line)
            {
                flag = 0;
                infile.close();
                this->close();

                ui->lineEdit->clear();
                ui->lineEdit_2->clear();
                QMessageBox::information(this, "Tips", "Login success!");
                In_username.clear();
                In_password.clear();
                form01->show();
                break;
            }
        }
        if(flag == 1)
        {
            ui->lineEdit->clear();
            ui->lineEdit_2->clear();
            QMessageBox::information(this, "Tips", "username or password is error!");
            In_username.clear();
            In_password.clear();
        }
    }
}

void Widget::on_pushButton_2_clicked()
{
    // this->hide();
    // this->close();
    qDebug() << "Change page to Register";
    form->show();
}

void Widget::on_pushButton_3_clicked()
{
    this->close();
    qDebug() << "Quit";
}

2.2 注册界面

注册界面命名对于文件为form.h、form.c

form.h

#ifndef FORM_H
#define FORM_H

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

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

public:
    void Open_file();

private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:
    Ui::Form *ui;

signals:
    void BackSig();  // define a signal without arg.
};

#endif // FORM_H

form.c

#include "form.h"
#include "ui_form.h"
#include "qdebug.h"
#include "widget.h"
#include "QLineEdit"
#include "QMessageBox"
#include "main.h"
#include "QDir"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    // this->show();

}

Form::~Form()
{
    delete ui;
}

void Form::on_pushButton_2_clicked()
{
    qDebug() << "Back";
    emit this->BackSig();

}

void Form::on_pushButton_clicked()
{
    ///

    QString path = QDir::currentPath(); // 获取当前工程所在路径
    std::size_t found; // 查找冒号的位置
    std::string user_pwd;  // Concatenated username and password
    std::string part1;   // useranme
    std::string part2;   // password
    std::string line;
    int flag = 1;

    std::ofstream outfile; // ready for writing

    // std::ifstream infile(path.toStdString() + "user_table.txt");
    std::ifstream infile("/root/QT_developer/File/user_table.txt");  // Absolute path
        if (!infile.is_open()) {              // Determine whether the opening is successful
            std::cerr << "Unable to open file!" << std::endl;
        }


    ///
    // gain data
    QString username = ui->lineEdit->text();
    QString password = ui->lineEdit_2->text();
    QString password_firm = ui->lineEdit_3->text();

    // pan duan yong hu ming shi fou chong fu
    if(username.isEmpty())
    {
        qDebug() << "username can't is empty";
        QMessageBox::information(this, "Tips", "username can't is empty");
    }else if(password.isEmpty()){
        QMessageBox::information(this, "Tips", "password can't is empty");
    }else if(password_firm.isEmpty())
    {
        QMessageBox::information(this, "Tips", "password_firm can't is empty");
    }else{
        // judge
        if(password != password_firm)
        {
            ui->lineEdit->clear();  // clear
            ui->lineEdit_2->clear();
            ui->lineEdit_3->clear();
            QMessageBox::information(this, "Tips", "password != password_firm!");
            username.clear();    // clear
            password.clear();
            password_firm.clear();

        }else{
            while (std::getline(infile, line)) {  // gain data on a line
                found = line.find(':');   // find :
                if (found != std::string::npos) {
                    part1 = line.substr(0, found); // 从开始到冒号前的部分
                    qDebug() << "part1-username: ";
                    cout << "part1-username: " << part1;
                }
                //
                if(QString::fromStdString(part1) == username)
                {
                    flag = 0;
                    infile.close();

                    ui->lineEdit->clear();
                    ui->lineEdit_2->clear();
                    ui->lineEdit_3->clear();
                    QMessageBox::information(this, "Tips", "username has been exist!");
                    username.clear();
                    password.clear();
                    password_firm.clear();
                    break;
                }
            }
            if(flag == 1){
                QMessageBox::information(this, "Tips", "Register success!");
                part1 = username.toStdString();
                part2 = password.toStdString();
                user_pwd = part1 + ":" + part2;
                outfile.open("/root/QT_developer/File/user_table.txt", ios::in | std::ios::out | std::ios::app);
                outfile << user_pwd << endl;
                outfile.close();

                ui->lineEdit->clear();
                ui->lineEdit_2->clear();
                ui->lineEdit_3->clear();
                username.clear();
                password.clear();
                password_firm.clear();
            }


        }
    }



}

2.3 登陆后的界面

登录后的界面命名对于文件为form01.h、form01.c

form01.h

#ifndef FORM01_H
#define FORM01_H

#include <QWidget>

namespace Ui {
class Form01;
}

class Form01 : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Form01 *ui;
};

#endif // FORM01_H

form01.c

#include "form01.h"
#include "ui_form01.h"

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

Form01::~Form01()
{
    delete ui;
}

3 完整资源

按照以上代码就能实现,如果有需要这是完整代码。也可以私我。

https://download.csdn.net/download/qq_51458770/89492862

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

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

相关文章

模型预测控制:线性MPC

模型预测控制&#xff1a;线性MPC 模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种广泛应用于工业过程控制和自动驾驶等领域的先进控制技术。MPC通过在线解决优化问题来计算控制输入&#xff0c;从而实现系统的最优控制。本文将介绍线性MPC的系统模…

C# 实现websocket双向通信

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C# &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff…

【地理库 Turf.js】

非常全面的地理库 &#xff0c; 这里枚举一些比较常用&#xff0c;重点的功能&#xff0c; 重点功能 提供地理相关的类&#xff1a;包括点&#xff0c;线&#xff0c;面等类。 测量功能&#xff1a;点到线段的距离&#xff0c;点和线的关系等。 判断功能&#xff1a; 点是否在…

Ubuntu系统打包ISO镜像文件

本文以ubuntu20.04系统为例 1.Systemback简介 Systemback 是一个开源的系统备份和恢复工具&#xff0c;它主要用于 Linux 操作系统。Systemback 可以帮助用户创建完整的系统备份&#xff0c;包括操作系统、应用程序、用户数据等&#xff0c;并且可以在需要时将系统恢复到备份的…

5G频段简介

5G频段 5G网络一共有29个频段&#xff0c;主要被分为两个频谱范围&#xff0c;其中6GHz以下的频段共有26个&#xff08;统称为Sub6GHz&#xff09;&#xff0c;毫米波频段有3个。目前国内主要使用的是Sub6GHz&#xff0c;包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

centos上部署Ollama平台,实现语言大模型本地部署

网上有很多大模型&#xff0c;很多都是远程在线调用ChatGPT的api来实现的&#xff0c;自己本地是没有大模型的&#xff0c;这里和大家分享一个大模型平台&#xff0c;可以实现本地快速部署大模型。 Ollama是一个开源项目&#xff0c;它提供了一个平台和工具集&#xff0c;用于部…

SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录 前言一、SDR模式1.1、设计代码1.2、testbench代码1.3、仿真分析 二、DDR模式下2.1、设计代码2.2、testbench代码2.3、仿真分析 三、OSERDES2级联3.1、设计代码3.2、testbench代码3.3、代码分析 前言 上文通过xilinx ug471手册对OSERDESE有了简单的了解&#xff0c;接…

数字化那点事:一文读懂数字乡村

一、数字乡村的定义 数字乡村是指利用信息技术和数字化手段&#xff0c;推动乡村社会经济发展和治理模式变革&#xff0c;提升乡村治理能力和公共服务水平&#xff0c;实现乡村全面振兴的一种新型发展模式。它包括农业生产的数字化、乡村治理的智能化、乡村生活的现代化等方面…

智慧校园-医务管理系统总体概述

智慧校园医务管理系统&#xff0c;作为校园健康管理体系的智能化升级&#xff0c;深度融合信息技术与医疗服务&#xff0c;为师生构筑起一道全方位的健康守护网。医务管理系统以提升校园医疗服务水平、优化健康管理流程为核心目标&#xff0c;通过一系列创新功能&#xff0c;确…

29.9一份的烤鸭,抖音为什么卖不出去?

文 | 螳螂观察 作者 | 青月 这两年&#xff0c;我的抖音推荐里&#xff0c;越来越常出现附近几km内的美食推荐。 就在昨天晚上&#xff0c;当我惯常打开抖音&#xff0c;才刷了几个视频&#xff0c;就跳出了一家距离我只有1.6km的烤鸭店。 这个短视频中&#xff0c;烤鸭在滋…

Python数据分析案例47——笔记本电脑价格影响因素分析

案例背景 博主对电脑的价格和配置一直略有研究&#xff0c;正好最近也有笔记本电脑相关的数据&#xff0c;想着来做点分析吧&#xff0c;写成一个案例。基本上描述性统计&#xff0c;画图&#xff0c;分组聚合&#xff0c;机器学习&#xff0c;交叉验证&#xff0c;搜索超参数…

基于语音识别的智能电子病历(二)苹果端的语音接入

是2011年参与的&#xff0c;俺负责Wav文件处理、FTP通讯和一些后端部分。iPhone/iPad/iPod Recorder 前2年还在APP Store上 说明 Step-by-Step Procedure to Install App and Use the FnetRecorder Download the App from Apple Store Launch Apple Store and key in “fnetr…

SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]

SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件 嵌入式Servlet容器 SpringBoot包含对嵌入式Tomcat、Jetty、Und…

【案例分享】南通中远海运川崎船舶运动轨迹智能分析及预测

航运作为一种运量大、成本低的运输方式&#xff0c;在全球贸易货物运输中发挥着十分重要的作用。随着船舶数量的增加和船舶大型化发展&#xff0c;航运业面临着温室气体排放、人力成本增加、航行安全不足等诸多挑战。近年来&#xff0c;为应对上述挑战&#xff0c;目前航运业正…

已解决javax.xml.bind.MarshalException:在RMI中,参数或返回值无法被编组的正确解决方法,亲测有效!!!

已解决javax.xml.bind.MarshalException&#xff1a;在RMI中&#xff0c;参数或返回值无法被编组的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 服务器端代码 客户端代码 报错原因 解决思路 解决方法 1. 实现…

打造你的第一个STM32步进电机控制器:详细教程与实战技巧

1. 引言 步进电机因其精确的位置控制和较高的响应速度&#xff0c;在自动化设备、3D打印机、CNC机床等领域广泛应用。本文将详细介绍如何使用STM32微控制器来控制步进电机&#xff0c;从理论到实践&#xff0c;帮助读者全面掌握这一重要技术。 STM32系列微控制器以其强大的性…

从入口文件搭建php项目

入口文件index.php <?phprequire CallBack.php; // 处理回调请求逻辑 $bot new CallBack();// 请求方式 if (isset($_GET[method])) {$method $_GET[method];if (method_exists($bot, $method)) {return $bot->$method();} else {echo "没有该功能";die();…

多元时间序列分析——VAR(向量自回归模型)

VAR模型主要是考察多个变量之间的动态互动关系&#xff0c;从而解释各种经济冲击对经济变量形成的动态影响。这种动态关系可通过格兰杰因果关系、脉冲响应以及方差分解来进一步明确和可视化。VAR模型主要研究内生变量之间的关系&#xff0c;内生变量就是参与模型并由模型体系内…

SmartEDA革新来袭:融合Multisim与Proteus精髓,引领电子设计新纪元!

在电子设计领域&#xff0c;每一次技术的革新都如同春风化雨&#xff0c;滋润着设计师们的心田。今天&#xff0c;我们迎来了一个划时代的电子设计自动化&#xff08;EDA&#xff09;工具——SmartEDA&#xff0c;它不仅融合了业界知名的Multisim和Proteus的精华&#xff0c;更…

NPOI入门指南:轻松操作Excel文件的.NET库

目录 引言 一、NPOI概述 二、NPOI的主要用途 三、安装NPOI库 四、NPOI基本使用 六、性能优化和内存管理 七、常见问题与解决方案 八、结论 附录 引言 Excel文件作为数据处理的重要工具&#xff0c;广泛应用于各种场景。然而&#xff0c;在没有安装Microsoft Office的…