笔记(后期复习补充)
作业
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
效果展示
![](https://i-blog.csdnimg.cn/direct/4f92860d8be546119d615a36a7943624.png)
没有勾选则无法点击确认键
![](https://i-blog.csdnimg.cn/direct/5a402c87da75473190292cc81d3967a3.png)
输入错误账户或密码(之后点击yes就关闭弹窗,登录界面不会关闭,可以继续登录,no就关闭弹窗并关闭登陆界面)
![](https://i-blog.csdnimg.cn/direct/f3590183e8f94c97bf6cfc750af657b7.png)
点击取消按钮(之后点击yes就关闭界面,no就关闭弹窗,登录界面不会关闭,可以继续登录)
![](https://i-blog.csdnimg.cn/direct/2a78ea7795a8404fbc3bd98978eb287b.png)
登录成功
![](https://i-blog.csdnimg.cn/direct/549ac582e3c44a84b212f2a68ade99c8.png)
点击ok后跳转第二界面
![](https://i-blog.csdnimg.cn/direct/4b99cfd5fa7c47019427c8c6d86b3cb6.png)
思维导图
刷题记录