优化登录框:
当用户点击取消按钮,弹出问题对话框,询问是否要确定退出登录,并提供两个按钮,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_OBJECTpublic: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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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);// 创建显示聊天记录的 QTextEditchatHistory = 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();
}