qt QMessageBox案例,2024.10.8

时间:2024-10-09 07:58:57

当用户点击取消按钮,弹出问题对话框,询问是否要确定退出登录,并提供两个按钮,yes|No,如果用户点击的Yes,则关闭对话框,如果用户点击的No,则继续登录

当用户点击的登录按钮,进行账号和密码的匹配,如果匹配成功,则弹出信息对话框,给出信息为,登录成功,并给出一个确定按钮,当用户点击该按钮后,关闭登录界面,弹出另一个界面

当账号和密码不匹配是,给出错误对话框,给出信息为账号和密码不匹配,是否重新登录,并提供两个按钮 Yes|No,如果用户点击了Yes,则清空密码框后,继续登录。如果用户点击的取消,则关闭登录界面

要求:静态成员函数版本和对象版本各至少实现一个

1.main.cpp

#include "loginwindow.h"
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    LoginWindow window;
    window.resize(300, 150);
    window.setWindowTitle("登录");
     app.setWindowIcon(QIcon(":/new/prefix1/pit/Character_sheet.png"));
    window.show();
    return app.exec();
}

2.loginwindow.h

#ifndef LOGINWINDOW_H
#define LOGINWINDOW_H


#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QMessageBox>

class LoginWindow : public  QWidget {
    Q_OBJECT

public:
    LoginWindow(QWidget *parent = nullptr); // 构造函数

private slots:
    void onLoginButtonClicked();   // 登录按钮点击处理
    void onCancelButtonClicked();  // 取消按钮点击处理

private:
    QLineEdit *usernameEdit;      // 用户名输入框
    QLineEdit *passwordEdit;      // 密码输入框
    QPushButton *loginButton;      // 登录按钮
    QPushButton *cancelButton;     // 取消按钮

    // 静态成员函数版本
    static void onStaticCancelButtonClicked(QApplication *app);
};

#endif // LOGINWINDOW_H

3.loginwindow.cpp

#include "loginwindow.h"
#include "successwindow.h"
#include <QApplication>
#include <QMessageBox>

// 构造函数实现
LoginWindow::LoginWindow(QWidget *parent) : QWidget(parent) {
    // 创建布局和控件
    QVBoxLayout *layout = new QVBoxLayout(this);

    usernameEdit = new QLineEdit(this);
    usernameEdit->setPlaceholderText("账号");

    passwordEdit = new QLineEdit(this);
    passwordEdit->setEchoMode(QLineEdit::Password);
    passwordEdit->setPlaceholderText("密码");

    loginButton = new QPushButton("登录", this);
    cancelButton = new QPushButton("取消", this);

    // 添加控件到布局
    layout->addWidget(usernameEdit);
    layout->addWidget(passwordEdit);
    layout->addWidget(loginButton);
    layout->addWidget(cancelButton);

    // 信号与槽连接
    connect(loginButton, &QPushButton::clicked, this, &LoginWindow::onLoginButtonClicked);
    connect(cancelButton, &QPushButton::clicked, this, &LoginWindow::onCancelButtonClicked);
}

// 登录按钮点击处理
void LoginWindow::onLoginButtonClicked() {
    QString correctUsername = "123";
    QString correctPassword = "123";

    if (usernameEdit->text() == correctUsername && passwordEdit->text() == correctPassword) {
        QMessageBox::information(this, "登录成功", "欢迎进入系统!", QMessageBox::Ok);
        this->close();  

         SuccessWindow *successWindow = new SuccessWindow();
         successWindow->show();
    } else {
        QMessageBox::StandardButton reply;
        reply = QMessageBox::question(this, "登录失败", "账号和密码不匹配,是否重新登录?", QMessageBox::Yes | QMessageBox::No);

        if (reply == QMessageBox::Yes) {
             // 清空密码框
            passwordEdit->clear();
        } else {
            this->close(); 
        }
    }
}

// 取消按钮点击处理
void LoginWindow::onCancelButtonClicked() {
    // 弹出确认对话框
    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(this, "确认退出", "您确定要退出登录吗?", QMessageBox::Yes | QMessageBox::No);

    if (reply == QMessageBox::Yes) {
        this->close();
    }
}

// 静态成员函数版本
void LoginWindow::onStaticCancelButtonClicked(QApplication *app) {
    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(nullptr, "确认退出", "您确定要退出登录吗?", QMessageBox::Yes | QMessageBox::No);

    if (reply == QMessageBox::Yes) {
        app->quit(); 
    }
}

4.successwindow.h

#ifndef SUCCESSWINDOW_H
#define SUCCESSWINDOW_H

#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>

class SuccessWindow : public QWidget {
    Q_OBJECT

public:
    SuccessWindow(QWidget *parent = nullptr);
};

#endif 

5.successwindow.cpp

#include "successwindow.h"

// 构造函数实现
SuccessWindow::SuccessWindow(QWidget *parent) : QWidget(parent) {
    QVBoxLayout *layout = new QVBoxLayout(this);
    QLabel *label = new QLabel("登录成功!欢迎使用本系统。", this);
    layout->addWidget(label);
    setLayout(layout);
    setWindowTitle("成功");
    resize(300, 100);
}