//mydialog.h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include<QtGui/QDialog>
//#include<QLineEdit>//也可以不要class QLineEdit;直接使用这种声明方式
class QLineEdit;
//该行代码的作用是告诉编译器,QlineEdit已经存在,这样做有如下好处
//首先,它减小了头文件的大小,增加了编译的速度(特别是当头文件被其他头文件多次包含引用时);
//其次,这样做可以避免因包含头文件的顺序不当而链接错误,特别是在大的工程当中更应该避免随意在
//一个头文件中包含另一个头文件。
class CMydialog:public QDialog
{
Q_OBJECT //启动Qt元对象系统的一些特性(比如支持信号与槽)
//它必须放置到类定义的私有区
public:
CMydialog(QWidget* = 0);//是构造函数,它指定了一个默认值为NULL 的指向QWidget的参数
//该形参定义了自定义对话框对象的父窗口部件,默认值NULL意味着
//自定义的对话框没有父窗口部件
public slots:
virtual void accept();
private:
QLineEdit* usrLineEdit;
QLineEdit* pwLineEdit;
};
#endif // MYDIALOG_H
//mydialog.cpp
#include "mydialog.h"
#include "QtGui/QtGui"
//类CMydialog的构造函数
CMydialog::CMydialog(QWidget* parent): QDialog(parent)
{
QLabel* usrLabel = new QLabel(trUtf8("用户名 :"));
QLabel* pwdLabel = new QLabel(trUtf8("密码 :"));
usrLineEdit = new QLineEdit;
pwLineEdit = new QLineEdit;
pwLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);//设置密码编辑框对象pwdLineEidt的内容显示方式为“×”
/* 显示方式还有一下几种:
*QLineEdit::Normal默认显示,显示用户输入的内容
*QLineEdit::Password显示星号
*QLineEdit::NoEcho不显示用会输入的内容
×QLineEdit::PasswordEchoOnEdit仅仅用户在行编辑框里编辑文本
×时,才显示用户输入的字符,而在用户完成编辑后以星号代替输入的内容
*/
/*创建一个布局管理器对象,并将窗口部件添加到该布局管理器中
*gridlayout->addWidget将先前生成的标签和行编辑框添加到网络管理器QGriLayout中
*gridlayout->addWidget中有5个参数,第一个实参指出那个窗口部件将被放置在网络布局管理器中
*后四个参数确定了行编辑框对象在网络布局管理器的位置,前两个实参分别表示行和列的位置(行号和列号)
*后两个分别表示行和列的跨度
*其实这里面位置信息都是相对的
*/
QGridLayout* gridlayout = new QGridLayout;
gridlayout->addWidget(usrLabel,0,0,1,1);
gridlayout->addWidget(usrLineEdit,0,1,1,3);
gridlayout->addWidget(pwdLabel,1,0,1,1);
gridlayout->addWidget(pwLineEdit,1,1,1,3);
/*创建两个按钮*/
QPushButton* okBtn =new QPushButton(trUtf8("确定"));
QPushButton* cancelBtn =new QPushButton(trUtf8("取消"));
/*创建水平布局管理器
*设置水平布局管理器对象内部窗口部件直接的间隔为60
*将两个按钮加入到水平管理器中
*按照两个部件的安放的先后顺序从左到右排布
*/
QHBoxLayout* btnLauout =new QHBoxLayout;
btnLauout->setSpacing(60);
btnLauout->addWidget(okBtn);
btnLauout->addWidget(cancelBtn);
/*
*创建垂直布局管理器
*该管理器将排布和管理先前创建的所有的布局管理器,进而完成对所有子窗口部件的管理
*dlgLayout->setMargin(40);设置边框的宽度为40
*dlgLayout->addStretch(40);设置内部直接的默认的距离为40,同时当上下拉伸对话框的高度时,该strech可以自由伸缩
*从而保证gridlayout和btnLauout管理器内部各窗口部件的高度已经彼此间的垂直距离保持不变
*/
QVBoxLayout* dlgLayout = new QVBoxLayout;
dlgLayout->setMargin(40);
dlgLayout->addLayout(gridlayout);
dlgLayout->addStretch(40);
dlgLayout->addLayout(btnLauout);
setLayout(dlgLayout);
connect(okBtn,SIGNAL(clicked()),this,SLOT(accept()));
connect(cancelBtn,SIGNAL(clicked()),this,SLOT(reject()));
setWindowTitle(trUtf8("登录"));
resize(300,200);
}
void CMydialog::accept()
{
/*QString::trimmed()移除在字符串开头和结尾的空白字符*/
if(usrLineEdit->text().trimmed() == trUtf8("lcf")
&&pwLineEdit->text() ==trUtf8("lcf"))
{
QDialog::accept();
}
else
{
QMessageBox::warning(this,trUtf8("警告"),
trUtf8("用户名或密码错误!!!"),
QMessageBox::Yes);
}
}
//main.cpp
#include <QApplication>
#include <QTranslator>
#include <QProcess>
#include <QLocale>
#include <QLibraryInfo>
#include <QDebug>
#include <QtGui/QtGui>
#include"mydialog.h"
int main(int argc,char* argv[])
{
QApplication app(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
CMydialog mydialog;
QMessageBox box;
QTranslator translator;
{
QStringList environment = QProcess::systemEnvironment();
QString str;
bool bFinded =false;
foreach(str,environment)
{
if(str.startsWith("QTDIR="))
{
bFinded =true;
break;
}
}
if(bFinded)
{
str=str.mid(6);
bFinded =translator.load("qt_"+QLocale::system().name(),
str.append("/translations"));
if(bFinded)
qApp->installTranslator(&translator);
else
{
// qDebug() << QObject::trUtf8("没有中文");
box.setWindowTitle("warning");
box.setIcon(QMessageBox::Warning);
box.setText("没有支持中文的国际化翻译软件!!");
box.setStandardButtons(QMessageBox::Yes);
box.exec();
}
}
else
{
//qDebug() << QObject::trUtf8("必须设置");
box.setWindowTitle("warning");
box.setIcon(QMessageBox::Warning);
box.setText("必须设置QTDIR环境变量!!");
box.setStandardButtons(QMessageBox::Yes);
box.exec();
exit(1);
}
}
return mydialog.exec();
}

