3、QLabel组件,在资源文件里载入图片,为QLabel组件的pixmap指定图片.对话框下方是用于用户名和密码输入的QLineEdit组件,两个按钮用于选择用户输入,设置“取消按钮的clicked.信号与对话框的reject()槽函数关联.但是“确定按钮的clicked.信号不要设置为与对话框的任何槽函数关联,需要对其编写自定义的槽函数代码,由于需要根据用户输入确定对话框返回结果.为对话框界面上的组件设置好布局.下面是qdlglogin.h文件中QDlgLogin类的定义:1.classQDlgLogin:publicQDialog2.3.Q_OBJECT4.privat
4、e:5.boolm_moving=false;表示窗口是否在鼠标操作下移动6.QPointm_lastPos;上一次的鼠标位置7.QStringm_user=user;/初始化用户名8.QStringm_pswd=12345;/初始化密码,未加密的9.intm_tryCount=0;/试错次数10.voidreadSettings();/读取设置,从注册表11.voidwriteSettings();写入设置,从注册表12.QStringencrypt(constQString&str);/字符串加密13.protected:14.
5、用于鼠标拖动窗口的鼠标事件操作15.voidmousePressEvent(QMouseEvent*event);16.voidmouseMoveEvent(QMouseEvent*event);17.voidmouseReleaseEvent(QMouseEvent*event);18.public:19.explicitQDlgLogin(QWidget*parent=0);20.QDlgLogin();21.privateslots:22.voidon_btnOK_clicked();OK按键23.private:24.Ui:dlgLogin
6、*ui;25.;在QDlgLogin类中,定义了一些私有成员变量:m_moving和m_lastPos用于在拖动窗口时记录移动状态和上次的位置,由于Splash窗口没看标题栏,所以采用在图片上拖拉的方式移动窗口,使用了3个鼠标事件来实现窗口拖动操作.m_user,m_pswd,m_tryCount用于记录用户名、密码和试错次数.readSettings()用于读取存储的设置,writeSettings()用于将设置存储,在Windows系统下,这些信息是存储在注册表里的.encrypt()函数用于对一个字符串进行加密.QDlgLogin类功能实现构造函数里的初始化
7、QDlgLogin类的构造函数代码如下:1.QDlgLogin:QDlgLogin(QWidget*parent):2.QDialog(parent),3.ui(newUi:dlgLogin)4.5.ui-setupUi(this);6.7.ui-editPSWD-setEchoMode(QLineEdit:Password);/密码输入编辑框设置为密码输入模式8.this-setAttribute(Qt:WA_DeleteOnClose);/设置为关闭时删除9.this-setWindowFlags(Qt:SplashScreen);设置为SplashScre
8、en,窗口无边框,不在任务栏显示10./this-setWindowFlags(Qt:FramelessWindowHint);/无边框,但是在任务显示对话框标题11.readSettings();/读取存储的用户名和密码12.QLineEdit:setEchoMode()函数设置编辑框回显方式,参数为QLineEdit二EchoMode枚举类型,这里设置为QLineEditiPassword回显方式,用于将密码输入回显为一个符号,而不显示真实字符.使用setWindowFlags()函数将窗口标志设置为Qt:SplashScreen,这样对话框显示为Splash窗口,无边
9、框,且在Windows任务栏上没有显示.另外一个类似的标志是Qt:FramelessWindowHint,它会使对话框无边框,但是会在任务栏上显示对话框的标题.初始设置后调用readSettings()函数读取存储的设置,根据存储的情况将用户名显示到窗口上的编辑框里.应用程序设置的存储自定义成员函数readSettings()用于读取应用程序设置,writeSettings()用于保存设置,实现代码如下:1.voidQDlgLogin二readSettings()2.读取存储的用户名和密码,密码是经过加密的3.QStringorganization=WWB-Qt;用于注册表
10、,4.QStringappName=samp6_5;HKEY_CURRENT_USER/Software/WWB-Qt/amp6_55.QSettingssettings(organization,appName);/创立6.boolsaved=settings.value(saved,false).toBool();/读取saved键的值7.m_user=settings.value(Username,user).toString();/读取Username键的值,缺省为user8.QStringdefaultPSWD=encrypt(12345);/
11、缺省密码12345加密后的数据9.m_pswd=settings.value(PSWD,defaultPSWD).toString();/读取PSWD键的值,10.if(saved)11.ui-editUser-setText(m_user);12.13.ui-chkBoxSave-setChecked(saved);14.15.16.voidQDlgLogin:writeSettings()17.保存用户名,密码等设置18.QSettingssettings(WWB-Qt,samp6_5);/注册表键组19.settings.setValue(Usernam
12、e,m_user);用户名20.settings.setValue(PSWD,m_pswd);/密码,经过加密的21.settings.setValue(saved,ui-chkBoxSave-isChecked();22.应用程序的设置是指应用程序需要保存的一些信息,在Windows系统下,这些信息保存在注册表里.使用QSettings类可以实现设置信息的读取和写入.创立QSettings对象时,需要传递organization和appName例如:QSettingssettings(WWB-Qt,samp6_5);指向的注册表目录是HKEY_CURRENTJJ
13、SER/Software/WWB-Qt/samp6_5注册表里参数是以“键-键值对来保存的.writeSettings()函数里使用setValue()函数写入键值,readSettings()里使用value()函数读取键值.读取键值时可以指定缺省值,即如果键不存在,就用缺省值作为读取的值.在Windows的开始菜单的输入框里输入regedit,翻开注册表,查找到目录HKEYCURRENTUSER/Software/WWB-Qt/samp63盼看到注册表里参数存储情况.其存储的密码是加密后的字符串.字符串加密本实例中密码采用加密后的字符串保存,这样在实际应用中具有平安性.Qt提供
14、了用于加密的类QCryptographicHash,自定义函数encrypt()就利用这个类进行字符串加密,实现代码如下:1.QStringQDlgLogin:encrypt(constQString&str)2.字符串MD5算法加密3.QByteArraybtArray;4.btArray.append(str);/参加原始字符串5.QCryptographicHashhash(QCryptographicHash:Md5);/Md5加密算法6.hash.addData(btArray);添加数据到加密哈希值7.QByteArrayresultArr
15、ay=hash.result();/返回最终的哈希值8.QStringmd5=resultArray.toHex();/转换为16进制字符串9.returnmd5;10.QCryptographicHash创立时需要指定一种加密算法,加密算法变量是枚举类型QCryptographicHash:Algorithm,常用的常量值有QCryptographicHash:Md4、QCryptographicHash二Md5QCryptographicHash二Sha512等,完整的描述可参考Qt的帮助文档.QCryptographicHash只提供了加密功能,没有提供解密功
17、户名和密码正确9.10.writeSettings();/保存设置11.this-accept();/对话框accept.,关闭对话框12.13.else14.15.m_tryCount+;错误次数16.if(m_tryCount3)17.18.QMessageBox:critical(this,错误,输入错误次数太多,强行退出);19.this-reject();/退出20.21.else22.QMessageBox:warning(this,错误提示,用户名或密码错误);23.24.由于QCryptographicHash只提供了加密功能,
18、没有提供解密功能,所以,在读取应用程序设定后,无法将加密后的密码解密并显示在窗口上,程序只能回显用户名,而不能回显密码.这段程序会对输入的密码进行加密,由于从注册表读取的是加密后的密码,所以能够比照输入的用户名和密码与存储的用户名和密码是否匹配.如果输入正确,调用窗口的accept()槽函数关闭对话框,对话框返回值为QDialog:Accepted,否那么试错次数加一;如果试错次数大于3次,就调用窗口的reject()槽函数关闭对话框,对话框返回值为QDialog:Rejected.窗口拖动功能的实现由于Splash窗口没有边框,因此不能像普通的窗口那样通过拖动窗口的标题栏来拖动窗
19、口.为了实现窗口的拖动功能,对窗口的3个鼠标事件进行处理,实现的代码如下:1.voidQDlgLogin:mousePressEvent(QMouseEvent*event)2.鼠标按键被按下3.if(event-button()=Qt:LeftButton)4.(5.m_moving=true;6.记录下鼠标相对于窗口的位置7./event-globalPos()鼠标按下时,鼠标相对于整个屏幕位置8./pos()this-pos()鼠标按下时,窗口相对于整个屏幕位置9.m_lastPos=event-globalPos()-pos();10.11.
20、returnQDialog:mousePressEvent(event);/12.13.14.voidQDlgLogin二mouseMoveEvent(QMouseEvent*event)15./鼠标按下左键移动16./(event-buttons()&Qt:LeftButton)按下是左键17.鼠标移动事件需要移动窗口,窗口移动到哪里呢就是要获取鼠标移动中,窗口在整个屏幕的坐标,然后move到这个坐标,怎么获取坐标18.通过事件event-globalPos()知道鼠标坐标,鼠标坐标减去鼠标相对于窗口位置,就是窗口在整个屏幕的坐标19.if(m_movin
21、g&(event-buttons()&Qt:LeftButton)20.&(event-globalPos()-m_lastPos).manhattanLength()QApplication二startDragDistance()21.22.move(event-globalPos()-m_lastPos);23.m_lastPos=event-globalPos()-pos();24.25.returnQDialog:mouseMoveEvent(event);26.27.28.voidQDlgLogin二mouseReleaseEvent(QMouseEvent*event)29.鼠标按键释放30.m_moving=false;/停止移动31.mousePressEvent(QMouseEvent*event)事件在鼠标按键按下时发生,传递的参数event有鼠标按键和坐标信息,判断如果是鼠标左键按下,就设置变量m_moving值为true,表示开始移动,并记录下鼠标坐标.event-globalPos()与对话框的pos()是不同坐标系下的坐标,在绘图这一章再详细介绍.mouseMoveEvent(QMouseEvent*event)事件在鼠