#include "login.h" #include "ui_login.h" Login::Login(QWidget *parent) : QMainWindow(parent), ui(new Ui::Login) { /**********ui_init**********/ ui->setupUi(this); this->setWindowIcon(QIcon(":/icon.png")); this->setTabOrder(ui->lineEdit_username,ui->lineEdit_password); this->setTabOrder(ui->lineEdit_password,ui->btn_signin); this->setWindowFlags(Qt::FramelessWindowHint); //无边框 this->setAttribute(Qt::WA_TranslucentBackground); new_closebutton(ui->close_btn,":/close.png", QSize(30, 30)); ui->btn_signin->installEventFilter(this); /********datamanager********/ datamanager = DataManager::getInstance(); connect(datamanager,&DataManager::signin_response,this,&Login::signin_response); connect(datamanager,&DataManager::signup_response,this,&Login::signup_response); connect(datamanager,&DataManager::connect_to_server,this,&Login::connected); connect(datamanager,&DataManager::disconnect_from_server,this,&Login::disconnected); connect(this,&Login::signin_request,datamanager,&DataManager::signin_request); connect(this,&Login::Register,datamanager,&DataManager::Register); } Login::~Login() { delete ui; } /**************************************QEvent*************************************/ void Login::paintEvent(QPaintEvent *event) { //创建画家,指定绘图设备 // QPainter painter(this); //创建QPixmap对象 // QPixmap pix; //加载图片 // pix.load(":/sources/xxx.png"); //绘制背景图 // painter.drawPixmap(0,0,this->width(),this->height(),pix); //绘制样式 // QBitmap bmp(this->size()); // bmp.fill(); // QPainter painter(&bmp); // painter.setPen(Qt::NoPen); // painter.setBrush(Qt::black); // painter.setRenderHint(QPainter::Antialiasing); // painter.drawRoundedRect(bmp.rect(), 6, 6); // setMask(bmp); QPixmap pix; pix.load(":/background.png"); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 反锯齿; painter.setPen(Qt::transparent); QRect rect = this->rect(); // rect为绘制大小 rect.setWidth(rect.width() - 1); rect.setHeight(rect.height() - 1); painter.drawRoundedRect(rect, 10, 10); // 10为圆角角度 painter.drawPixmap(rect, pix); //绘制背景图 // painter.setBrush(QBrush(QColor(255,245,225,240))); // painter.setPen(Qt::transparent); //也可用QPainterPath 绘制代替 painter.drawRoundedRect(rect, 15, 15); // QPainterPath painterPath; // painterPath.addRoundedRect(rect, 15, 15);//15为圆角角度 // painter.drawPath(painterPath); //设置阴影 QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this); shadow->setOffset(0, 0); //设置阴影距离 shadow->setColor(QColor("#87CEFA")); //设置阴影颜色 shadow->setBlurRadius(10); //设置阴影圆角 ui->btn_signin->setGraphicsEffect(shadow); ui->btn_signup->setGraphicsEffect(shadow); } void Login::mousePressEvent(QMouseEvent *event) { if (event->buttons() == Qt::LeftButton) { point = event->pos(); } } void Login::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() == Qt::LeftButton) { //当窗口最大化或最小化时也不进行触发 if (Login::isMaximized() || Login::isMinimized()) { return; } else { //当在按钮之类需要鼠标操作的地方不进行触发(防误触) if (ui->btn_signin->underMouse() || ui->btn_signup->underMouse()) { return; } else { Login::move(Login::mapToGlobal(event->pos() - point)); } } } event->accept(); } /***************************************SLOTS************************************/ void Login::on_btn_signin_clicked() { this->zoom_down(ui->btn_signin); this->zoom_up(ui->btn_signin); if(connect_flag == true) { user = ui->lineEdit_username->text(); passwd = ui->lineEdit_password->text(); if(user.isEmpty() || passwd.isEmpty()) { QMessageBox::warning(this,tr("错误"),tr("用户名和密码不能为空!")); return; } emit signin_request(user,passwd); } else { QMessageBox::warning(this, "登录失败", "尚未连接服务器!"); return; } } void Login::on_btn_signup_clicked() { this->zoom_down(ui->btn_signup); this->zoom_up(ui->btn_signup); signup = new Signup(); connect(signup,&Signup::show_login_ui,this,&Login::show_login_ui); connect(signup,&Signup::Register,this,&Login::slot_Register); this->hide(); signup->show(); } void Login::on_close_btn_clicked() { this->close(); } void Login::show_login_ui() { this->show(); } //等待服务器验证登陆数据 void Login::signin_response(bool result) { if(result == true) { mainwidget = new MainWidget(user); connect(mainwidget,&MainWidget::send_text,datamanager,&DataManager::send_text); connect(mainwidget,&MainWidget::send_to_user,datamanager,&DataManager::send_to_user); connect(mainwidget,&MainWidget::send_file_private,datamanager,&DataManager::send_file_private); connect(mainwidget,&MainWidget::send_file_to_all,datamanager,&DataManager::send_file_to_all); connect(mainwidget,&MainWidget::account_cancellation,datamanager,&DataManager::account_cancellation); connect(mainwidget,&MainWidget::update_namelist,datamanager,&DataManager::update_namelist); connect(datamanager,&DataManager::update_text,mainwidget,&MainWidget::update_text); connect(datamanager,&DataManager::update_file,mainwidget,&MainWidget::update_file); connect(datamanager,&DataManager::update_file_private,mainwidget,&MainWidget::update_file_private); connect(datamanager,&DataManager::update_users,mainwidget,&MainWidget::update_users); connect(mainwidget,&MainWidget::exit_client,this,&Login::exit_client); this->hide(); mainwidget->show(); } else { QMessageBox::warning(this,tr("登录失败"),tr("用户名或密码错误!")); } } //等待服务器注册数据 void Login::signup_response(bool result) { if(result == true) { QString information = QString("请妥善保存您的用户名和密码!"); QMessageBox::information(signup,tr("注册成功"),information); signup->close(); this->show(); } else { QMessageBox::warning(signup,tr("错误"),tr("注册失败,请重试!")); } } //注册界面按下注册按键 void Login::slot_Register(QString username,QString password) { if(connect_flag == false) { QMessageBox::warning(signup, "注册失败", "尚未连接服务器!请连接服务器后重试"); return; } emit Register(username,password); } //连接上服务器 void Login::connected() { qDebug() << "connect to server"; connect_flag = true; } //未连上服务器或服务器断开 void Login::disconnected() { qDebug() << "disconnect from server"; connect_flag = false; } void Login::exit_client() { this->close(); } /************************************private functions************************************/ void Login::zoom_down(QPushButton* btn) { QPropertyAnimation *animalton = new QPropertyAnimation(btn,"geometry"); //设置间隔时间 animalton->setDuration(200); //设置起始位置 animalton->setStartValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); //设置结束位置 animalton->setEndValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); //设置动画曲线 animalton->setEasingCurve(QEasingCurve::OutBounce); animalton->start(); } void Login::zoom_up(QPushButton* btn) { QPropertyAnimation *animalton = new QPropertyAnimation(btn,"geometry"); animalton->setDuration(200); animalton->setStartValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); animalton->setEndValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); animalton->setEasingCurve(QEasingCurve::OutBounce); animalton->start(); } void Login::new_closebutton(QPushButton* btn, QString position,QSize size) { QPixmap pixmap; pixmap.load(position); btn->setIconSize(size); btn->setStyleSheet("QPushButton{border-width: 1px;border-style: solid;border-radius:15px;background-color: rgb(64, 145, 252);}" "QPushButton:hover{background-color:#999999;}"); //设置图标 btn->setIcon(pixmap); } bool Login::eventFilter(QObject *target, QEvent *event) { if(target == ui->btn_signin) //可替换 { if(event->type() == QEvent::KeyPress)//回车键 { QKeyEvent *k = static_cast(event); if(k->key() == Qt::Key_Return || k->key() == Qt::Key_Enter) { on_btn_signin_clicked(); //替换为需要响应的函数事件,以这里的按钮为例 return true; } } } return QWidget::eventFilter(target,event); }