优化登录框:
当用户点击取消按钮,弹出问题对话框,询问是否要确定退出登录,并提供两个按钮,yes|No,如果用户点击的Yes,则关闭对话框,如果用户点击的No,则继续登录
当用户点击的登录按钮,进行账号和密码的匹配,如果匹配成功,则弹出信息对话框,给出信息为,登录成功,并给出一个确定按钮,当用户点击该按钮后,关闭登录界面,弹出另一个界面
当账号和密码不匹配是,给出错误对话框,给出信息为账号和密码不匹配,是否重新登录,并提供两个按钮 Yes|No,如果用户点击了Yes,则清空密码框后,继续登录。如果用户点击的取消,则关闭登录界面
要求:静态成员函数版本和对象版本各至少实现一个
chatwidget.h:
#ifndef CHATWIDGET_H
#define CHATWIDGET_H
#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
namespace Ui {
class ChatWidget;
}
class ChatWidget : public QWidget
{
Q_OBJECT
public:
explicit ChatWidget(QWidget *parent = nullptr);
~ChatWidget();
private slots:
void onSendClicked();
private:
Ui::ChatWidget *ui;
QTextEdit *chatHistory; // 显示聊天记录的文本框
QLineEdit *inputMessage; // 输入消息的文本框
};
#endif // CHATWIDGET_H
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QLineEdit *qqNumberEdit; // QQ号输入框
QLineEdit *passwordEdit; // 密码输入框
bool validateCredentials(const QString &qqNumber, const QString &password);
signals:
void jumpToMainWindow(); // 跳转信号
private slots:
void onLoginClicked(); // 登录按钮点击事件
void onCancelClicked(); // 取消按钮点击事件
};
#endif // WIDGET_H
chatwidget.cpp:
#include "chatwidget.h"
#include <QVBoxLayout>
#include <QMessageBox>
#include <QPushButton>
#include <QTextEdit>
#include <QLineEdit>
ChatWidget::ChatWidget(QWidget *parent) :
QWidget(parent)
{
// 设置窗口标题
setWindowTitle("聊天界面");
// 设置窗口大小
resize(400, 500);
// 创建垂直布局
QVBoxLayout *layout = new QVBoxLayout(this);
// 创建显示聊天记录的 QTextEdit
chatHistory = new QTextEdit(this);
chatHistory->setReadOnly(true); // 设置为只读
layout->addWidget(chatHistory);
// 创建输入框
inputMessage = new QLineEdit(this);
inputMessage->setPlaceholderText("输入消息...");
layout->addWidget(inputMessage);
// 创建发送按钮
QPushButton *sendButton = new QPushButton("发送", this);
layout->addWidget(sendButton);
// 连接发送按钮点击事件
connect(sendButton, &QPushButton::clicked, this, &ChatWidget::onSendClicked);
// 设置布局
setLayout(layout);
}
ChatWidget::~ChatWidget()
{
}
void ChatWidget::onSendClicked()
{
QString message = inputMessage->text().trimmed();
if (!message.isEmpty()) {
// 将消息添加到聊天记录
chatHistory->append("我: " + message);
inputMessage->clear(); // 清空输入框
} else {
QMessageBox::warning(this, "消息为空", "请输入消息后再发送!");
}
}
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QMessageBox>
#include <QCheckBox>
#include <QDebug>
#include "chatwidget.h" // 引入聊天界面的头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("QQ Login");
// 设置窗口大小
resize(300, 400);
// 设置背景颜色
setStyleSheet("background-color: #F0F0F0;");
// 创建垂直布局
QVBoxLayout *layout = new QVBoxLayout(this);
// 创建头像标签
QLabel *avatarLabel = new QLabel(this);
avatarLabel->setPixmap(QPixmap("D:\\tu\\yuan.jpg").scaled(100, 100, Qt::KeepAspectRatio));
avatarLabel->setAlignment(Qt::AlignCenter);
layout->addWidget(avatarLabel);
// 创建QQ号输入框
qqNumberEdit = new QLineEdit(this);
qqNumberEdit->setPlaceholderText("输入QQ号码");
qqNumberEdit->setStyleSheet("QLineEdit { padding: 10px; font-size: 16px; border-radius: 5px; border: 1px solid #CCC; }");
layout->addWidget(qqNumberEdit);
// 创建密码输入框
passwordEdit = new QLineEdit(this);
passwordEdit->setPlaceholderText("输入QQ密码");
passwordEdit->setEchoMode(QLineEdit::Password);
passwordEdit->setStyleSheet("QLineEdit { padding: 10px; font-size: 16px; border-radius: 5px; border: 1px solid #CCC; }");
layout->addWidget(passwordEdit);
// 添加间隔
layout->addSpacing(10); // 增加空白间隔
// 创建复选框,表示是否同意服务协议
QCheckBox *agreementCheckBox = new QCheckBox("我已阅读并同意服务协议和QQ隐私保护指引", this);
agreementCheckBox->setStyleSheet("QCheckBox { color: #666; font-size: 12px; }");
layout->addWidget(agreementCheckBox);
// 添加间隔
layout->addSpacing(10); // 增加空白间隔
// 创建登录按钮
QPushButton *loginButton = new QPushButton("登录", this);
loginButton->setStyleSheet("QPushButton { background-color: #4CAF50; color: white; padding: 10px; font-size: 16px; border-radius: 5px; }"
"QPushButton:hover { background-color: #45a049; }");
layout->addWidget(loginButton);
// 创建取消按钮
QPushButton *cancelButton = new QPushButton("取消", this);
cancelButton->setStyleSheet("QPushButton { background-color: #f44336; color: white; padding: 10px; font-size: 16px; border-radius: 5px; }"
"QPushButton:hover { background-color: #d32f2f; }");
layout->addWidget(cancelButton);
// 连接按钮点击事件
connect(loginButton, &QPushButton::clicked, this, &Widget::onLoginClicked);
connect(cancelButton, &QPushButton::clicked, this, &Widget::onCancelClicked);
// 设置布局
setLayout(layout);
}
Widget::~Widget()
{
}
void Widget::onLoginClicked()
{
QString qqNumber = qqNumberEdit->text().trimmed(); // 去除前后空格
QString password = passwordEdit->text().trimmed(); // 去除前后空格
// 验证账号和密码
if (validateCredentials(qqNumber, password))
{
QMessageBox::information(this,
"消息对话框",
"登录成功",
QMessageBox::Yes);
emit jumpToMainWindow(); // 发射跳转信号
this->close(); // 关闭当前窗口
ChatWidget *chatWidget = new ChatWidget();
chatWidget->show(); // 显示聊天界面
}
else
{
int res = QMessageBox::warning(this,
"登录失败",
"给出信息为账号和密码不匹配,是否重新登录",
QMessageBox::Yes | QMessageBox::No);
if(res == QMessageBox::Yes)
{
passwordEdit->clear(); // 清空密码框
passwordEdit->setFocus(); // 将焦点设置回密码框
}else if(res == QMessageBox::No)
{
this->close(); // 关闭当前窗口
}
}
}
bool Widget::validateCredentials(const QString &qqNumber, const QString &password)
{
if (qqNumber.isEmpty() || password.isEmpty())
{
return false; // 账号或密码为空
}
if (password.length() < 6)
{
return false; // 密码太短
}
if (qqNumber == password)
{
return false; // 账号和密码相同
}
return true; // 验证通过
}
void Widget::onCancelClicked()
{
QMessageBox box(QMessageBox::Question,
"问题对话框",
"您确定要取消登录",
QMessageBox::Yes | QMessageBox::No,
this);
int res = box.exec();
if(res == QMessageBox::Yes)
{
this->close(); // 关闭当前窗口
}
}
main.cpp:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}