设计模式(4)-外观模式(Facade) (三)

2014-11-24 11:48:39 · 作者: · 浏览: 6
d()),this,SLOT(cancel()));
connect(pushButton_ok,SIGNAL(clicked()),this,SLOT(Login()));
}

void LoginDlg::cancel()
{
lineEdit_username->clear();
lineEdit_passwd->clear();

close();
}
LoginDlg::LoginDlg()
{
//qDebug()<<"construct_login";
initDlg();
initConnect();
}

LoginDlg::~LoginDlg()
{
delete label_username;
delete label_passwd;
delete lineEdit_username;
delete lineEdit_passwd;
delete pushButton_ok;
delete pushButton_cancel;

//qDebug()<<"desstruct_login";
}

void LoginDlg::initDlg()
{
setWindowFlags(Qt::FramelessWindowHint);
label_username = new QLabel;
label_username->setText(tr("用 户 名:"));
label_passwd = new QLabel;
label_passwd->setText(tr("用户密码:"));
lineEdit_username = new QLineEdit;
lineEdit_username->setFocus();
lineEdit_passwd = new QLineEdit;
lineEdit_passwd->setEchoMode(QLineEdit::Password);

pushButton_ok = new QPushButton;
pushButton_ok->setText(tr("确定"));
pushButton_ok->setIcon(style()->standardIcon(QStyle::SP_DialogOkButton));
pushButton_cancel = new QPushButton;
pushButton_cancel->setText(tr("取消"));
pushButton_cancel->setIcon(style()->standardIcon(QStyle::SP_DialogCancelButton));

QGridLayout *gridLayout = new QGridLayout;
gridLayout->addWidget(label_username,0,0);
gridLayout->addWidget(lineEdit_username,0,1);
gridLayout->addWidget(label_passwd,1,0);
gridLayout->addWidget(lineEdit_passwd,1,1);

QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch();
buttonLayout->addWidget(pushButton_ok);
buttonLayout->addStretch();
buttonLayout->addWidget(pushButton_cancel);
buttonLayout->addStretch();

QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(gridLayout);
mainLayout->addLayout(buttonLayout);
mainLayout->addStretch();

setLayout(mainLayout);
}

void LoginDlg::initConnect()
{
connect(pushButton_cancel,SIGNAL(clicked()),this,SLOT(cancel()));
connect(pushButton_ok,SIGNAL(clicked()),this,SLOT(Login()));
}

void LoginDlg::cancel()
{
lineEdit_username->clear();
lineEdit_passwd->clear();

close();
}

LoginDlg类中initDlg、cancel方法,应用了外观模式。cancel方法运用了多态特性,覆盖了LoginDlg的父类QDialog的cancel方法,是LoginDlg类的一个私有槽函数。外观模式的应用使得构造函数更为清晰,initConnect方法更为简单。这时可以利用:

[html]
connect(pushButton_cancel,SIGNAL(clicked()),this,SLOT(cancel()));
connect(pushButton_cancel,SIGNAL(clicked()),this,SLOT(cancel()));
来取代

[html] view plaincopyprint connect(pushButton_cancel,SIGNAL(clicked()),lineEdit_username,SLOT(clear()));
connect(pushButton_cancel,SIGNAL(clicked()),lineEdit_passwd,SLOT(clear()));
connect(pushButton_cancel,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_cancel,SIGNAL(clicked()),lineEdit_username,SLOT(clear()));
connect(pushButton_cancel,SIGNAL(clicked()),lineEdit_passwd,SLOT(clear()));
connect(pushButton_cancel,SIGNAL(clicked()),this,SLOT(close()));

将界面设计的代码从构造函数中,单独分离,也是一种好的设计方式。

*对外观模式有更好的见解,欢迎留言,交流学习。

作者:tandesir