2025.1.8(qt图形化界面之消息框)

笔记(后期复习补充)

作业

1> 手动将登录项目实现,不要使用拖拽编程

并且,当点击登录按钮时,后台会判断账号和密码是否相等,如果相等给出登录成功的提示,并且关闭当前界面,发射一个跳转信号,如果登录失败,则给出登录失败的提示,并清空密码框

当点击取消按钮时,直接关闭当前登录框

优化登录框:

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

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

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

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

main。cpp文件

#include "widget.h"
#include "form.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    Form f;
    w.show();
     QObject::connect(&w,
             &Widget::mysignal_1,
             &f,
             &Form::myform_verify
           );

    return a.exec();
}

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 slots:
    void myform_verify();       //槽函数声明

private:
    Ui::Form *ui;
};

#endif // FORM_H

widget.h头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QIcon>
#include <QLabel>
#include <QPushButton>
#include <QPixmap>
#include <QLineEdit>
#include <QTimer>           //延时头文件
#include <QMessageBox>      //对话框头文件
#include <QCheckBox>        //选择勾选按钮头文件

#define btn1 btn_verify     //确认按钮
#define btn2 btn_Cancel         //取消按钮
#define label2 label_cipher     //密码标签
#define label1 label_account    //账户标签
#define line1 line1_account      //账户输入框
#define line2 line2_cipher     //密码输入框

class Widget : public QWidget
{
    Q_OBJECT

signals:
    void  mysignal_1();   //自定义信号1
    void  mysignal_2();   //自定义信号2
public slots:
    void myslots1_verify();     //槽函数声明,确认按钮点击后的响应
    void color_1();         //恢复颜色
    void myslots2_verify();          //取消按钮点击后的响应
    void my_che1hh(int state);      // 勾选框状态变化的槽函数
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    QLabel *label_logo;
    QLabel *label1;
    QLabel *label2;
    QPushButton *btn1;
    QPushButton *btn2;
    QLineEdit *line1;
    QLineEdit *line2;
    QCheckBox *my_che1;        //勾选确认按钮定义
};
#endif // WIDGET_H

form.cpp文件

#include "form.h"
#include "ui_form.h"

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

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

void Form::myform_verify()
{
    this->show();


}

widget。cpp文件

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //主窗口设置
    this->setFixedSize(400,600);        //窗体大小
    this->setWindowIcon(QIcon(":/pictrue/qq2.gif"));    //图标
    this->setWindowTitle("霜雪快聊");       //窗体上文字
    this->setStyleSheet("background-color: lightpink; color: darkred;");

    //logo标签设置
    label_logo = new QLabel(this);   //实例化对象并认父组件
    label_logo->resize(200,150);        //logo窗体大小
    label_logo->move(100,50);
    label_logo->setAlignment(Qt::AlignCenter);      //文本居中
    label_logo->setPixmap(QPixmap("C:/Users/Administrator/Desktop/qqq.png"));   //图片载入
    label_logo->setScaledContents(true);    //大小自适应

    //label1账户标签设置
    label1 = new QLabel;    //实例化对象
    this->label1->setParent(this);      //设置父对象,方便管理生命周期等
    label1->setText("账户");              //设置文本
    label1->setPixmap(QPixmap(":/pictrue/wodepeizhenshi.png"));     //设置图标(图片)
    label1->resize(20,30);      //设置大小
    label1->move(50,250);       //相对于主窗口绝对位置
    label1->setScaledContents(true);            //大小自适应
    label1->setAlignment(Qt::AlignCenter);  //文本居中
    this->setStyleSheet("background-color:lightred;color:darkgreen;");      //设置颜色

    //label2密码标签设置
    label2 = new QLabel(this);    //实例化对象,设置父对象,方便管理生命周期等
    label2->setText("密码");              //设置文本
    label2->setPixmap(QPixmap(":/pictrue/passwd.jpg"));     //设置图标(图片)
    label2->resize(20,30);      //设置大小
    label2->move(label1->x(),label1->y()+label1->height()+50);       //相对于label1绝对位置
    label2->setScaledContents(true);            //大小自适应
    label2->setAlignment(Qt::AlignCenter);  //文本居中
    this->setStyleSheet("background-color:lightred;color:darkgreen;");      //设置颜色

    //line1账户输入框设置
    this->line1 = new QLineEdit(""); //实例化对象,设置文本
    this->line1->setParent(this);             //设置父对象
    line1->setPlaceholderText("请输入你的账号");   //设置提示性文本
    this->line1->resize(200,30);              //设置大小
    this->line1->move(label1->x()+label1->width()+50,label1->y());  //设置位置
    this->line1->setAlignment(Qt::AlignCenter);         //文本居中
    this->line1->setStyleSheet("background-color:lightred;color:darkgreen;");   //设置颜色(背景和字体)

    //line2密码输入框设置
    this->line2 = new QLineEdit(""); //实例化对象,设置文本
    this->line2->setParent(this);             //设置父对象
    line2->setPlaceholderText("请输入你的密码");   //设置提示性文本
    this->line2->resize(200,30);              //设置大小
    this->line2->move(label2->x()+label2->width()+50,label2->y());  //设置位置
    this->line2->setAlignment(Qt::AlignCenter);         //文本居中
    this->line2->setStyleSheet("background-color:lightred;color:darkgreen;");   //设置颜色(背景和字体)
    line2->setEchoMode(QLineEdit::Password);        //密文设置(输入密码以黑点代替)

    //btn1确认按钮设置
    btn1 = new QPushButton("确认",this);  //实例化对象,设置文本,设置父对象
    btn1->resize(50,30);        //设置大小
    btn1->move(label2->x()+50,label2->y()+100); //设置位置
    btn1->setStyleSheet("background-color: red; color: white;");    //颜色设置

    //btn2取消按钮设置
    btn2 = new QPushButton("取消"); //实例化对象,设置文本
    btn2->setParent(this);          //设置父对象
    btn2->resize(50,30);            //设置大小
    btn2->move(btn2->x()+btn2->width()+180,btn1->y());     //设置位置
    btn2->setStyleSheet("background-color: red; color: white;");    //颜色设置

    //勾选确认按钮设置
    my_che1 = new QCheckBox("我同意本条款",this); //实例化对象,设置文本,设置父对象
    my_che1->move(100,500);

    //勾选确认按钮连接槽函数my_che1hh
    connect(my_che1,
            &QCheckBox::stateChanged,
            this,
            &Widget::my_che1hh); // 勾选框状态变化


    //连接点击按钮1的信号到槽函数1
    connect(btn1,
            &QPushButton::clicked,
            this,
            &Widget::myslots1_verify
            );

    //连接点击按钮2的信号到槽函数2
    connect(btn2,
            &QPushButton::clicked,
            this,
            &Widget::myslots2_verify
            );
}

void Widget::my_che1hh(int state)
{
    if(state == Qt::Checked)   // 如果勾选框被选中,启用登录按钮
    {
        btn1->setEnabled(true);     //按钮启用函数
    }
    else        // 如果勾选框未选中,禁用登录按钮
    {
        btn1->setEnabled(false);
    }
}



#if 1

void Widget::myslots1_verify()     //槽函数,确认按钮点击后的响应
{
    QString text1 = line1->text();  //获取输入框1文本,文本也可以直接使用,如下
    QString text2 = line2->text();  //获取输入框2文本

    if(!my_che1->isChecked())
    {
        QMessageBox::warning(this,"登陆失败","请先同意条款!",QMessageBox::Ok);
        return ; 如果未选中,直接返回,不执行后续登录逻辑
    }
    // 检查输入框是否为空
    if (text1.isEmpty() || text2.isEmpty())
    {
        QMessageBox::warning(this, "登录失败", "账号或密码不能为空!", QMessageBox::Ok);
        return; // 如果输入框为空,直接返回
    }
    if(text1 == "1111"&&line2->text()=="1111")
    {
        btn1->setStyleSheet("background-color: white; color: red;");    //颜色设置
        QTimer::singleShot(200,this,&Widget::color_1);         //设置定时器,时间过后恢复原来的颜色
        // 弹出信息对话框
        int res1 = QMessageBox::information(this,"登录成功","登录成功!!",QMessageBox::Ok);
        if(res1 == QMessageBox::Ok)
        {
            emit mysignal_1();   //发射一个信号用于其他槽函数操作(登陆成功),静态成员函数版本
        }

        this->close();      //关闭登录窗口
    }
    else
    {
        //登录失败,弹出问题对话 ,静态成员函数版本
        int res = QMessageBox::warning(this,"登录失败","账户和密码错误,是否重新输入?",
                                       QMessageBox::Yes|      //确认按钮
                                       QMessageBox::No);      //取消按钮
        if(res == QMessageBox::Yes)
        {
            line2->clear();         //密码不匹配则清空密码
        }
        else
        {
            close();        //关闭当前窗口,包括登录窗口
        }
    }
}
#endif

#if 1
//基于属性版本
void Widget::myslots2_verify()  // 点击取消按钮的槽函数应答
{
    emit mysignal_2();       // 发射一个信号用于其他槽函数操作

    // 创建一个QMessageBox对象,设置其父窗口为当前Widget窗口
    QMessageBox msgBox(this);

    // 设置消息框的图标为Question类型,通常用于询问用户
    msgBox.setIcon(QMessageBox::Question);

    // 设置消息框的主文本,即标题
    msgBox.setText("退出登录");

    // 设置消息框的附加文本,提供更多信息
    msgBox.setInformativeText("确定要退出吗,不再聊会吗?");

    // 设置消息框的标准按钮,包括Yes和No按钮
    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);

    // 设置默认按钮为No,这样用户按下回车键时不会退出
    msgBox.setDefaultButton(QMessageBox::No);

    // 设置消息框的模态性为WindowModal,这样用户必须响应消息框才能继续
    msgBox.setWindowModality(Qt::WindowModal);

    // 显示消息框并获取用户选择,exec()方法会阻塞当前线程直到消息框关闭
    int resultme = msgBox.exec(); // 显示消息框并获取用户选择

    // 检查用户是否点击了Yes按钮
    if(resultme == QMessageBox::Yes)
    {
        close();        // 如果用户点击Yes,则关闭当前界面
    }
    // 如果用户点击No,则不需要任何操作,因为消息框会自动关闭,并且不会执行close()方法
}

#endif

#if 0
//静态成员函数版本
void Widget::myslots2_verify()  //点击取消按钮的槽函数应答
{
    emit mysignal_2();       //发射一个信号用于其他槽函数操作
    int resultme = QMessageBox::question(this,"退出登录","确定要退出吗,不再聊会吗?",QMessageBox::Yes|QMessageBox::No);
    if(resultme==QMessageBox::Yes)
    {
        close();        //关闭当前界面
    }
    //如果用户点击No,则不需要任何操作,直接执行下一步,关闭当前界面
    this->close();
}
#endif
void Widget::color_1()
{
    btn1->setStyleSheet("background-color: red; color: white;");    //颜色设置
}


Widget::~Widget()
{
}
#if 0
void Widget::myslots1_verify() {
    // 获取输入框1的文本内容
    QString text1 = line1->text();

    // 比较输入框1和输入框2的文本内容
    if (text1 == line2->text()) {
        // 如果文本内容匹配,设置按钮的样式表
        btn1->setStyleSheet("background-color: white; color: red;");

        // 使用 QTimer::singleShot 设置一个定时器,200 毫秒后调用 color_1 槽函数
        // 用于恢复按钮的原始颜色
        QTimer::singleShot(200, this, &Widget::color_1);

        // 弹出信息对话框,提示登录成功
        QMessageBox::information(this, "登录成功", "登录成功!!", QMessageBox::Ok);

        // 发射一个信号 mysignal_1,用于通知其他部分登录成功
        emit mysignal_1();

        // 关闭当前窗口
        this->close();
    } else {
        // 如果文本内容不匹配,清空密码输入框(line2)
        line2->clear();

        // 弹出错误提示对话框
        QMessageBox::warning(this, "登录失败", "账号或密码错误,请重试!", QMessageBox::Ok);
    }
}

#endif

效果展示

没有勾选则无法点击确认键

输入错误账户或密码(之后点击yes就关闭弹窗,登录界面不会关闭,可以继续登录,no就关闭弹窗并关闭登陆界面)

点击取消按钮(之后点击yes就关闭界面,no就关闭弹窗,登录界面不会关闭,可以继续登录)

登录成功

点击ok后跳转第二界面

思维导图

刷题记录

相关推荐
NPE~34 分钟前
[渗透测试]热门搜索引擎推荐— — fofa篇
开发语言·搜索引擎·渗透测试·php·教程·软件推荐·fofa
霍熠烁38 分钟前
Objective-C语言的云计算
开发语言·后端·golang
WANGWUSAN661 小时前
Python教程:使用Matplotlib模块画柱状图、饼形图、直方图
开发语言·经验分享·python·程序人生·matplotlib·数据可视化
饮长安千年月1 小时前
CVE-2024-13025-Codezips 大学管理系统 faculty.php sql 注入分析及拓展
开发语言·数据库·sql·网络安全·php
计算机视觉-Archer2 小时前
[NKU]C++安装环境 VScode
开发语言·c++
东方忘忧2 小时前
QT全局所有QSS样式实时切换
开发语言·数据库·qt
关关钧3 小时前
【R语言】相关系数
开发语言·python·r语言
六毛的毛3 小时前
后端开发ThreadLocal简介
java·开发语言
hhw1991124 小时前
.net一些知识点5
开发语言·.net
鹤临于青山4 小时前
《从0到1CTFer成长之路》逆向工程个人笔记--静态分析
开发语言·安全