在分享之前,我们先看截图,用事实说话,有图有真相!
通过点击底部栏的新浪,人人按钮来进行3个界面的互相切换,进行用户删除时,自定义的QDialog用于和用户交互,通过exec()可进入堵塞状态。
界面设计思路:
实现界面时,界面切换必不可少,实现界面切换主要用到QStackedLayout,QWidget通过QStackedLayout的setCurrentWidget()来显示当前界面!
#pragma once /* 功能:登录界面(360,新浪,人人登录) 时间:2018-5-12 */ #include "drop_shadow_widget.h" #include <QDialog> #include <QStackedLayout> #include <QLabel> #include <QPushButton> #include <QCheckBox> #include <QComboBox> #include <QLineEdit> #include <QListWidgetItem> #include <QListWidget> #include <QGridLayout> #include "push_button.h" #include "common.h" #include "util.h" #include "msg_box.h" #include "loading_widget.h" class login_dialog : public drop_shadow_widget { Q_OBJECT public: login_dialog(QWidget *parent=0); ~login_dialog(); void translateLanguage(); //翻译 protected: void paintEvent(QPaintEvent *event); private slots: void turnSina(); void turnRenRen(); void showAccount(QString account); void removeAccount(QString account); void verify(); //点击登录按钮,出现的界面 private: void initSafeWidget(); void initRenRenWidget(); void initSinaWidget(); void initLoginCenter(); //初始化界面中间部分 void changeTitle(); void turnWidget(); private: QStackedLayout *main_stacked_layout; //新浪,360,人人网界面 QStackedLayout *stacked_layout; //360,人人网界面 QStackedLayout *login_stacked_layout; //360,登录验证界面 QWidget *safe_renren_center_widget; //360,人人网界面的中间部分 QWidget *safe_renren_widget; //安全卫士界面 QWidget *safe_widget; QLabel *icon_label; QLabel *safe_label; QLabel *protect_label; QWidget *renren_widget; //人人界面 QLabel *renren_icon_label; QLabel *renren_info_label; QLabel *renren_net_label; QLabel *renren_login_label; QWidget *sina_widget; //新浪界面 QLabel *sina_icon_label; //新浪图标 QLabel *sina_info_label; //新浪微博 QLabel *sina_net_label; //sina.com QPushButton *sina_register_button; //新浪注册按钮 QLineEdit *sina_account_line_edit; //新浪账号 QLineEdit *sina_password_line_edit; //新浪密码 QPushButton *examine_authorize_button; //查看授权信息 QPushButton *authorize_button; //授权按钮 QCheckBox *sina_login_check_box; //自动登录 QCheckBox *safe_attention_check_box; //关注360安全卫士 QLabel *title_label; QLabel *account_label; QLabel *password_label; QLabel *other_account_label; push_button *close_button; QPushButton *sina_button; QPushButton *renren_button; QLineEdit *password_line_edit; QPushButton *register_button; QPushButton *forgot_button; QPushButton *login_button; QCheckBox *remember_check_box; QCheckBox *auto_login_check_box; QComboBox *account_combo_box; QListWidget *list_widget; LOGIN login; //显示登录界面 LOGIN sina_login; //新浪按钮表示的界面 msg_box *message_box; //删除用户提示界面 loading_widget *loading_widge; //等待界面,正在登陆 };
#include "login_dialog.h" #include "util.h" #include "accountItem.h" login_dialog::login_dialog(QWidget *parent) : drop_shadow_widget(parent) { this->resize(370,275); login = SAFE; sina_login = SINA; message_box = new msg_box(); loading_widge = new loading_widget(this); safe_renren_center_widget = new QWidget(this); this->initLoginCenter(); this->initRenRenWidget(); this->initSafeWidget(); this->initSinaWidget(); //堆栈窗口 login_stacked_layout = new QStackedLayout(); main_stacked_layout = new QStackedLayout(); stacked_layout = new QStackedLayout(); login_stacked_layout->addWidget(safe_renren_center_widget); //登录窗口 login_stacked_layout->addWidget(loading_widge); login_stacked_layout->setCurrentWidget(safe_renren_center_widget); stacked_layout->addWidget(safe_widget); stacked_layout->addWidget(renren_widget); stacked_layout->setCurrentWidget(safe_widget); safe_widget->setFixedHeight(70); safe_renren_widget = new QWidget(this); title_label = new QLabel(); other_account_label = new QLabel(); close_button = new push_button(); sina_button = new QPushButton(); renren_button = new QPushButton(); title_label->setAlignment(Qt::AlignBottom); QPixmap sina_pixmap(":/loginDialog/sina"); sina_button->setIcon(sina_pixmap); sina_button->setIconSize(QSize(20, 20)); sina_button->setFixedSize(25, 22); QPixmap renren_pixmap(":/loginDialog/renren"); renren_button->setIcon(renren_pixmap); renren_button->setIconSize(QSize(20, 20)); renren_button->setFixedSize(25, 22); sina_button->setObjectName("skinButton"); renren_button->setObjectName("skinButton"); close_button->setPicName(QString(":/sysButton/close")); title_label->setObjectName("whiteLabel"); QHBoxLayout *title_layout = new QHBoxLayout(); title_layout->addWidget(title_label); title_layout->addStretch(); title_layout->addWidget(close_button); title_layout->setSpacing(0); title_layout->setContentsMargins(10, 0, 5, 10); QHBoxLayout *bottom_layout = new QHBoxLayout(); bottom_layout->addWidget(other_account_label); bottom_layout->addWidget(sina_button); bottom_layout->addWidget(renren_button); bottom_layout->addStretch(); bottom_layout->setSpacing(5); bottom_layout->setContentsMargins(20, 0, 0, 5); QVBoxLayout *safe_renren_layout = new QVBoxLayout(); safe_renren_layout->addLayout(stacked_layout); safe_renren_layout->addStretch(); safe_renren_layout->addLayout(login_stacked_layout); safe_renren_layout->setSpacing(0); safe_renren_layout->setContentsMargins(0, 0, 0, 0); safe_renren_widget->setLayout(safe_renren_layout); main_stacked_layout->addWidget(safe_renren_widget); main_stacked_layout->setCurrentWidget(safe_renren_widget); QHBoxLayout *login_layout = new QHBoxLayout(); login_layout->addStretch(); login_layout->addWidget(login_button); login_layout->setSpacing(0); login_layout->setContentsMargins(0, 0, 20, 10); QVBoxLayout *main_layout = new QVBoxLayout(); main_layout->addLayout(title_layout); main_layout->addLayout(main_stacked_layout); main_layout->addLayout(login_layout); main_layout->addLayout(bottom_layout); main_layout->setSpacing(0); main_layout->setContentsMargins(SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH); connect(close_button, SIGNAL(clicked()), this, SLOT(hide())); connect(renren_button, SIGNAL(clicked()), this, SLOT(turnRenRen())); connect(sina_button, SIGNAL(clicked()), this, SLOT(turnSina())); connect(login_button, SIGNAL(clicked()), this, SLOT(verify())); this->setLayout(main_layout); this->translateLanguage(); } login_dialog::~login_dialog() { } //360头部 void login_dialog::initSafeWidget() { safe_widget = new QWidget(this); icon_label = new QLabel(); safe_label = new QLabel(); protect_label = new QLabel(); safe_label->setAlignment(Qt::AlignRight|Qt::AlignBottom); protect_label->setAlignment(Qt::AlignRight|Qt::AlignTop); QFont safe_font = safe_label->font(); safe_font.setPointSize(14); safe_label->setFont(safe_font); safe_label->setObjectName("whiteLabel"); protect_label->setObjectName("whiteLabel"); icon_label->setFixedSize(70,70); icon_label->setPixmap(QPixmap(":/img/360safe")); //按比例缩放图片 icon_label->setScaledContents(true); QVBoxLayout *info_layout = new QVBoxLayout(); info_layout->addWidget(safe_label); info_layout->addWidget(protect_label); info_layout->addStretch(); info_layout->setSpacing(5); info_layout->setContentsMargins(0,0,0,0); QHBoxLayout *main_layout = new QHBoxLayout(); main_layout->addWidget(icon_label); main_layout->addStretch(); main_layout->addLayout(info_layout); main_layout->setSpacing(0); main_layout->setContentsMargins(30,0,20,0); safe_widget->setLayout(main_layout); } //人人头部 void login_dialog::initRenRenWidget() { renren_widget = new QWidget(); renren_icon_label = new QLabel(); renren_info_label = new QLabel(); renren_net_label = new QLabel(); renren_login_label = new QLabel(); QFont renren_info_font = renren_info_label->font(); renren_info_font.setPointSize(14); renren_info_label->setFont(renren_info_font); QFont renren_login_font = renren_login_label->font(); renren_login_font.setPointSize(14); renren_login_label->setFont(renren_login_font); //设置样式 renren_icon_label->setStyleSheet("color:rgb(0,90,170);"); renren_net_label->setStyleSheet("color:rgb(0,90,170);"); renren_login_label->setStyleSheet("color:white"); QPixmap icon_pixmap(":/loginDialog/ren"); renren_icon_label->setPixmap(icon_pixmap); renren_icon_label->setFixedSize(icon_pixmap.size()); renren_icon_label->setScaledContents(true); QVBoxLayout *info_layout = new QVBoxLayout(); info_layout->addStretch(); info_layout->addWidget(renren_info_label); info_layout->addWidget(renren_net_label); info_layout->addStretch(); //表示控件与窗体的左右边距 //info_layout->setMargin(); //表示各个控件之间的上下间距 info_layout->setSpacing(0); info_layout->setContentsMargins(0,0,0,0); QHBoxLayout *main_layout = new QHBoxLayout(); main_layout->addWidget(renren_icon_label); main_layout->addLayout(info_layout); main_layout->addStretch(); main_layout->addWidget(renren_login_label); main_layout->setSpacing(5); main_layout->setContentsMargins(30,0,20,0); renren_widget->setLayout(main_layout); } // void login_dialog::initLoginCenter() //初始化界面中间部分 { account_label = new QLabel(); password_label = new QLabel(); register_button = new QPushButton(); forgot_button = new QPushButton(); login_button = new QPushButton(); password_line_edit = new QLineEdit(); remember_check_box = new QCheckBox(); auto_login_check_box = new QCheckBox(); //鼠标手势 register_button->setCursor(Qt::PointingHandCursor); forgot_button->setCursor(Qt::PointingHandCursor); account_combo_box = new QComboBox(); //列表框 list_widget = new QListWidget(); account_combo_box->setModel(list_widget->model()); account_combo_box->setView(list_widget); account_combo_box->setEditable(true); for (int i =0; i < 3;i++) { accountItem *account_item = new accountItem(); //QString::number 将整数转字符串 account_item->setAccountNumber(QString("safe_") + QString::number(i, 10) + QString("@sina.com")); connect(account_item, SIGNAL(showAccount(QString)), this, SLOT(showAccount(QString))); connect(account_item, SIGNAL(removeAccount(QString)), this, SLOT(removeAccount(QString))); QListWidgetItem *list_item = new QListWidgetItem(list_widget); list_widget->setItemWidget(list_item, account_item); } //图片自动缩放 account_label->setScaledContents(true); password_label->setScaledContents(true); //account_label->setAlignment(Qt::AlignRight); //设置密码框 password_line_edit->setEchoMode(QLineEdit::Password); account_combo_box->setFixedHeight(25); password_line_edit->setFixedHeight(25); register_button->setFixedSize(70,25); forgot_button->setFixedSize(70,25); login_button->setFixedSize(60,25); login_button->setObjectName("loginGreenButton"); register_button->setObjectName("blueButton"); forgot_button->setObjectName("blueButton"); QHBoxLayout *h_layout = new QHBoxLayout(); h_layout->addWidget(remember_check_box); h_layout->addWidget(auto_login_check_box); h_layout->addStretch(); h_layout->setSpacing(40); h_layout->setContentsMargins(0,0,0,0); QGridLayout *grid_layout = new QGridLayout(); grid_layout->addWidget(account_label,0,0); grid_layout->addWidget(account_combo_box, 0, 1); grid_layout->addWidget(register_button, 0, 2); grid_layout->addWidget(password_label, 1, 0); grid_layout->addWidget(password_line_edit, 1, 1); grid_layout->addWidget(forgot_button, 1, 2); grid_layout->addLayout(h_layout, 2, 1); grid_layout->setHorizontalSpacing(5); grid_layout->setVerticalSpacing(10); grid_layout->setContentsMargins(20,0,20,0); safe_renren_center_widget->setLayout(grid_layout); } //初始化新浪界面 void login_dialog::initSinaWidget() { sina_widget = new QWidget(); sina_icon_label = new QLabel(); sina_info_label = new QLabel(); sina_net_label = new QLabel(); sina_register_button = new QPushButton(); sina_account_line_edit = new QLineEdit(); sina_password_line_edit = new QLineEdit(); examine_authorize_button = new QPushButton(); authorize_button = new QPushButton(); sina_login_check_box = new QCheckBox(); safe_attention_check_box = new QCheckBox(); sina_password_line_edit->setEchoMode(QLineEdit::Password); sina_net_label->setAlignment(Qt::AlignTop); sina_info_label->setAlignment(Qt::AlignBottom); sina_register_button->setCursor(Qt::PointingHandCursor); examine_authorize_button->setCursor(Qt::PointingHandCursor); sina_account_line_edit->setFixedHeight(30); sina_password_line_edit->setFixedHeight(30); QPixmap icon_pixmap(":/loginDialog/sina"); sina_icon_label->setPixmap(icon_pixmap); sina_icon_label->setFixedSize(icon_pixmap.size()); sina_icon_label->setScaledContents(true); QFont sina_info_font = sina_info_label->font(); sina_info_font.setPointSize(14); sina_info_font.setItalic(true); sina_info_label->setFont(sina_info_font); //设置网站 QFont sina_net_font = sina_net_label->font(); sina_net_font.setItalic(true); sina_net_label->setFont(sina_net_font); sina_register_button->setObjectName("blueButton"); examine_authorize_button->setObjectName("examineAuthorizeButton"); authorize_button->setFixedSize(90, 30); QFont authorize_font = authorize_button->font(); authorize_font.setPointSize(14); authorize_button->setFont(authorize_font); authorize_button->setObjectName("redButton"); QVBoxLayout *info_layout = new QVBoxLayout(); info_layout->addWidget(sina_info_label); info_layout->addWidget(sina_net_label); info_layout->setSpacing(0); info_layout->setContentsMargins(0, 0, 0, 0); QHBoxLayout *sina_layout = new QHBoxLayout(); sina_layout->addWidget(sina_icon_label); sina_layout->addLayout(info_layout); sina_layout->addStretch(); sina_layout->setSpacing(5); sina_layout->setContentsMargins(0, 0, 0, 0); QGridLayout *grid_layout = new QGridLayout(); grid_layout->addLayout(sina_layout, 0, 0); grid_layout->addWidget(sina_register_button, 0, 2); grid_layout->addWidget(sina_account_line_edit, 1, 0, 1, 3); grid_layout->addWidget(sina_password_line_edit, 2, 0, 1, 3); grid_layout->addWidget(examine_authorize_button, 3, 0); grid_layout->addWidget(authorize_button, 3, 2, Qt::AlignRight); grid_layout->setHorizontalSpacing(5); grid_layout->setVerticalSpacing(10); grid_layout->setContentsMargins(50, 0, 50, 0); QHBoxLayout *h_layout = new QHBoxLayout(); h_layout->addStretch(); h_layout->addWidget(sina_login_check_box); h_layout->addWidget(safe_attention_check_box); h_layout->setSpacing(20); h_layout->setContentsMargins(0, 0, 20, 0); QVBoxLayout *main_layout = new QVBoxLayout(); main_layout->addLayout(grid_layout); main_layout->addLayout(h_layout); main_layout->setSpacing(20); main_layout->setContentsMargins(0, 0, 0, 0); sina_widget->setLayout(main_layout); } void login_dialog::translateLanguage() { message_box->translateLanguage(); this->changeTitle(); close_button->setToolTip(tr("close")); safe_label->setText(tr("360 safe")); protect_label->setText(tr("protect every day")); renren_info_label->setText(tr("renren")); renren_net_label->setText(tr("renren.com")); renren_login_label->setText(tr("login by renren")); account_label->setText(tr("account")); password_label->setText(tr("password")); other_account_label->setText(tr("other account")); register_button->setText(tr("register")); forgot_button->setText(tr("forgot")); login_button->setText(tr("login")); remember_check_box->setText(tr("remember")); auto_login_check_box->setText(tr("auto login")); sina_info_label->setText(tr("sina info")); sina_net_label->setText(tr("sina net")); sina_register_button->setText(tr("sina register")); examine_authorize_button->setText(tr("examine authorize")); authorize_button->setText(tr("authorize")); sina_login_check_box->setText(tr("sina login")); safe_attention_check_box->setText(tr("safe attention")); sina_account_line_edit->setPlaceholderText(tr("sina account")); } void login_dialog::turnRenRen() { switch (login) { //如果显示的登录界面是360 case SAFE: { if (sina_login==SINA) { login = RENREN; } else { login = SINA; } //改变标题 this->changeTitle(); this->turnWidget(); renren_button->setIcon(QIcon(":/img/safe")); }; break; case RENREN: { if (sina_login == SINA) { login = SAFE; } else { login = SINA; } this->changeTitle(); this->turnWidget(); renren_button->setIcon(QIcon(":/loginDialog/renren")); } break; case SINA: { if (sina_login==SAFE) { login = RENREN; } else { login = SAFE; } this->changeTitle(); this->turnWidget(); renren_button->setIcon(QIcon(":/loginDialog/sina")); } break; default: break; } } void login_dialog::turnSina() { switch (login) { case SAFE: { if (sina_login==SINA) { login = SINA; } else { login = RENREN; } this->changeTitle(); this->turnWidget(); sina_login = SAFE; sina_button->setIcon(QIcon(":/img/safe")); } break; case RENREN: { if (sina_login==SINA) { login = SINA; } else { login = SAFE; } this->changeTitle(); this->turnWidget(); sina_login = RENREN; sina_button->setIcon(QIcon(":/loginDialog/renren")); } break; case SINA: { if (sina_login==SAFE) { login = SAFE; update(); } else { login = RENREN; } this->changeTitle(); this->turnWidget(); sina_login = SINA; sina_button->setIcon(QIcon(":/loginDialog/sina")); } break; default: break; } } void login_dialog::changeTitle() { switch (login) { case SAFE: title_label->setText(tr("360 safe login")); break; case SINA: title_label->setText(tr("login by sina")); break; case RENREN: title_label->setText(tr("login by renren")); break; default: title_label->setText(tr("360 safe login")); } } void login_dialog::turnWidget() { switch (login) { case SAFE: { main_stacked_layout->removeWidget(sina_widget); this->resize(370,275); QWidget *current_widget = main_stacked_layout->currentWidget(); if (current_widget!=safe_renren_widget) { main_stacked_layout->setCurrentWidget(safe_renren_widget); } QWidget *stack_current_widget = stacked_layout->currentWidget(); if (stack_current_widget!=safe_widget) { stacked_layout->setCurrentWidget(safe_widget); register_button->show(); forgot_button->show(); auto_login_check_box->show(); } login_button->show(); } break; case SINA: { this->resize(400,310); main_stacked_layout->addWidget(sina_widget); QWidget *current_widget = main_stacked_layout->currentWidget(); if (current_widget==safe_renren_widget) { main_stacked_layout->setCurrentWidget(sina_widget); login_button->hide(); } } break; case RENREN: { main_stacked_layout->removeWidget(sina_widget); this->resize(370, 275); QWidget *current_widget = main_stacked_layout->currentWidget(); if (current_widget != safe_renren_widget) { main_stacked_layout->setCurrentWidget(safe_renren_widget); } QWidget *stack_current_widget = stacked_layout->currentWidget(); if (stack_current_widget != renren_widget) { stacked_layout->setCurrentWidget(renren_widget); register_button->hide(); forgot_button->hide(); } login_button->show(); } break; default: break; } } void login_dialog::paintEvent(QPaintEvent *event) { drop_shadow_widget::paintEvent(event); bool is_sina = false; int width = this->width(); int height = this->height(); switch (login) { case SINA: is_sina = true; break; default: break; } int draw_height = 95; if (is_sina) { draw_height = 35; } QString skin_name = util::getSkinName(); //标题绘制 QPainter painter(this); painter.setPen(Qt::NoPen); painter.setBrush(Qt::white); painter.drawPixmap(QRect(SHADOW_WIDTH, SHADOW_WIDTH, this->width() - 2 * SHADOW_WIDTH, this->height() - 2 * SHADOW_WIDTH), QPixmap(skin_name)); //新浪分割线 int sina_line = 0; if (is_sina) { sina_line = 3; QLinearGradient linear(rect().topLeft(),rect().bottomRight()); //void QGradient::setColorAt ( qreal position, const QColor & color ) //position 是一个0 - 1区间的数字。也就是说,position 是相对于我们建立渐变对象时做的那个起始点和终止点区间的 linear.setColorAt(0,QColor(240,30,50)); linear.setColorAt(0, QColor(240, 30, 50)); linear.setColorAt(0, QColor(240, 30, 50)); linear.setColorAt(0, QColor(240, 30, 50)); linear.setColorAt(0, QColor(240, 30, 50)); linear.setColorAt(0, QColor(240, 30, 50)); QPainter painter2(this); painter2.setBrush(QBrush(linear)); painter2.setPen(Qt::NoPen); painter2.drawRect(QRect(SHADOW_WIDTH, draw_height, width - 2 * SHADOW_WIDTH, sina_line)); } QPainter painter3(this); painter3.setPen(Qt::NoPen); painter3.setBrush(Qt::white); painter3.drawRect(QRect(SHADOW_WIDTH, draw_height + sina_line, width - 2 * SHADOW_WIDTH, height - draw_height - sina_line - SHADOW_WIDTH)); } void login_dialog::showAccount(QString account) { account_combo_box->setEditText(account); //将account_combo_box收起来 account_combo_box->hidePopup(); } void login_dialog::removeAccount(QString account) { message_box->setInfo(tr("remove account"),tr("are you sure to remove account"),QPixmap(":/loginDialog/attention"),false); //确认删除 if (message_box->exec()==QDialog::Accepted) { int list_count = list_widget->count(); for (int i = 0; i < list_count;i++) { QListWidgetItem *item = list_widget->item(i); accountItem *account_item = (accountItem *)(list_widget->itemWidget(item)); QString account_number = account_item->getAccountNumber(); if (account==account_number) { list_widget->takeItem(i); delete item; break; } } } account_combo_box->hidePopup(); } void login_dialog::verify() { bool is_hidden = false; bool is_login_hidden = false; login = SAFE; QWidget *current_widget = login_stacked_layout->currentWidget(); if (current_widget != loading_widge) { login_button->setText(tr("cancel")); is_hidden = true; login_stacked_layout->setCurrentWidget(loading_widge); loading_widge->setAccount(account_combo_box->lineEdit()->text()); loading_widge->start(true); } else { login_button->setText(tr("login")); loading_widge->start(false); login_stacked_layout->setCurrentWidget(safe_renren_center_widget); is_login_hidden = auto_login_check_box->isHidden(); } if (is_login_hidden) { login = RENREN; stacked_layout->setCurrentWidget(renren_widget); } else { stacked_layout->setCurrentWidget(safe_widget); } changeTitle(); other_account_label->setHidden(is_hidden); sina_button->setHidden(is_hidden); renren_button->setHidden(is_hidden); }本文转自:http://blog.sina.com.cn/s/blog_a6fb6cc90101ecr1.html