Qt 登录窗口跳转主窗口

登录模块实现

把用户密码信息存储在xml文件里,通过读取xml文件实现登录功能。
注: 需要在 .pro文件 添加 xmlQT += core gui xml

loginfo.xml文件信息如下:
loginfo.xml
登录窗口,如下图:
在这里插入图片描述

代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

loginwidget.h

#ifndef LOGINWIDGET_H
#define LOGINWIDGET_H

#include "mainwindow.h"
#include <QWidget>
#include <QMessageBox>
#include <QDomDocument>
#include <QFile>
#include <QDebug>

namespace Ui {
class LoginWidget;
}

class LoginWidget : public QWidget
{
    Q_OBJECT

public:
    explicit LoginWidget(QWidget *parent = 0);
    ~LoginWidget();

public:
    void showMainWindow();

private slots:
    void on_loginBtn_clicked();

private:
    Ui::LoginWidget *ui;
    //指向主窗口的指针
    MainWindow *mainWindow;
    //全局变量用于获取XML中的DOM对象
    QDomDocument mydoc;
};

#endif // LOGINWIDGET_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

}

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

loginwidget.cpp

#include "loginwidget.h"
#include "ui_loginwidget.h"

QString xmlpath = "./xml/loginfo.xml";  //XML文件路径

LoginWidget::LoginWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LoginWidget)
{
    ui->setupUi(this);
    this->setWindowTitle(tr("登录"));

    //输入密码框隐藏密码
    ui->passwordEdit->setEchoMode(QLineEdit::Password);
}

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

//实现登录验证功能
void LoginWidget::showMainWindow()
{
    QFile file(xmlpath);  //创建XML文件对象
    mydoc.setContent(&file);  //将XML对象赋给QdomDocument类型的Qt文档句柄
    QDomElement root = mydoc.documentElement();  //获取XML文档的DOM根元素
    if(root.hasChildNodes())
    {
        QDomNodeList userList = root.childNodes();  //获取根元素的全部子节点
        bool exist = false;  //指示用户是否存在
        for(int i = 0; i < userList.count(); i++)
        {
            QDomNode user = userList.at(i);  //根据当前索引i获取用户节点元素
            QDomNodeList record = user.childNodes();  //该用户的全部属性元素
           //解析出用户名及密码
            QString uname = record.at(0).toElement().text(); //"user1","user2"
            QString pword = record.at(1).toElement().text(); //"password1","password2"
            if(uname == ui->userNameEdit->text())
            {
                exist = true;  //用户存在
                if(!(pword == ui->passwordEdit->text()))
                {
                    QMessageBox::warning(0, QObject::tr("failed"), "密码错误,请重新输入!");
                    ui->passwordEdit->clear();
                    ui->passwordEdit->setFocus();
                    return;
                }
            }
        } //for
        if(!exist)
        {
            QMessageBox::warning(0, QObject::tr("failed"), "此用户不存在,请重新输入!");
            ui->userNameEdit->clear();
            ui->passwordEdit->clear();
            ui->userNameEdit->setFocus();
            return;
        }
       //用户存在且密码验证通过
        mainWindow = new MainWindow(0);
        mainWindow->setWindowTitle(tr("主窗口"));
        mainWindow->show();  //显示主窗口
    } //if
}
void LoginWidget::on_loginBtn_clicked()
{
    //根据验证结果判断是否进入主窗口
    showMainWindow();
}

main.cpp

#include "mainwindow.h"
#include "loginwidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();
    LoginWidget w;
    w.show();

    return a.exec();
}

程序运行结果
  1. 用户名不存在:
    在这里插入图片描述
  2. 用户名存在,密码输入错误:
    在这里插入图片描述
  3. 用户名,密码输入正确,点击登录跳转到主窗口:
    在这里插入图片描述
Qt中,可以通过使用QStackedWidget来实现从登录界面跳转界面。QStackedWidget是一个容器小部件,可以在其中添加多个子部件,只有当前显示的子部件会被用户看到。 具体实现方法如下: 1. 创建QStackedWidget对象。 ```cpp QStackedWidget *stackedWidget = new QStackedWidget(); ``` 2. 创建登录界面界面的QWidget对象,并将它们添加到QStackedWidget中。 ```cpp QWidget *loginWidget = new QWidget(); QWidget *mainWidget = new QWidget(); stackedWidget->addWidget(loginWidget); stackedWidget->addWidget(mainWidget); ``` 3. 在登录界面中,添加按钮并在槽函数中调用QStackedWidget的setCurrentWidget()方法,将当前显示的子部件设置为界面。 ```cpp QPushButton *loginButton = new QPushButton("Login"); connect(loginButton, &QPushButton::clicked, [=](){ stackedWidget->setCurrentWidget(mainWidget); }); ``` 4. 在界面中,添加按钮并在槽函数中调用QStackedWidget的setCurrentWidget()方法,将当前显示的子部件设置为登录界面。 ```cpp QPushButton *logoutButton = new QPushButton("Logout"); connect(logoutButton, &QPushButton::clicked, [=](){ stackedWidget->setCurrentWidget(loginWidget); }); ``` 5. 将QStackedWidget对象设置为窗口的中心部件。 ```cpp QMainWindow *mainWindow = new QMainWindow(); mainWindow->setCentralWidget(stackedWidget); ``` 这样就可以实现从登录界面跳转界面,以及从界面返回到登录界面的功能了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值