0.设计
参考QQ的登陆框的布局,不过功能更简单。
主要加了两个辅助功能:密码保存(用的SQLite),以及监测键盘大小写状态。
1.实现细节
(1)密码保存操作的类主要功能是将用户信息保存到数据库,以及查询用户列表、查询用户信息等,主要接口如下:
class LoginDBOperate : public QObject
{
Q_OBJECT
//最近操作的账号列表
Q_PROPERTY(QStringList accounts READ getAccounts NOTIFY accountsChanged)
//数据库open状态
Q_PROPERTY(bool opened READ getOpened WRITE setOpened NOTIFY openedChanged)
public:
QStringList getAccounts();
bool getOpened() const;
void setOpened(bool open);
//最后登陆的用户登陆信息
Q_INVOKABLE QJsonObject lastUserInfo();
//根据用户名查询用户登陆信息
Q_INVOKABLE QJsonObject searchUserInfo(const QString &account);
//保存用户登陆信息
Q_INVOKABLE void saveUserInfo(const QString &account,bool savepassword,const QString &password);
//抹掉用户的密码信息
Q_INVOKABLE void forgetUserInfo(const QString &account);
//... ...
private:
QSqlDatabase db;
};
使用SQL模块需要在pro文件中添加:
QT += sql
(2)检测键盘大小写状态我使用的 Windows API:
#include <Windows.h>
bool KeyboardUtil::isCapslock() const
{
//对于该API返回值
//如果高位为1,则按键按下;否则为0。否则,它会上升。
//如果低位为1,则切换键。如果打开了一个键(例如CAPS LOCK键),则会对其进行切换。
//如果低位为0,则此键处于关闭状态且不切换。
//切换键时,键盘上的切换键指示灯(如果有)将亮起,而当取消切换键时,其指示灯将熄灭。
return (GetKeyState(VK_CAPITAL)!=0);
}
这个API是在User模块里的,所以还要把库引入进来,在pro文件添加:
LIBS += User32.LIB
有了检测接下来就做实时监测这个状态,我用的事件过滤器来监测CapsLock按键是否按下:
bool KeyboardUtil::eventFilter(QObject *watched, QEvent *event)
{
if(event->type()==QEvent::KeyPress||
event->type()==QEvent::KeyRelease){
QKeyEvent *keyevent=static_cast<QKeyEvent*>(event);
if(keyevent->key()==Qt::Key_CapsLock){
emit capslockChanged();
}
}
return QObject::eventFilter(watched,event);
}
(3)QtWidgets有QCompleter类来做输入提示/自动补全,但是QML没有,所以账号列表项我用的Popup放了一个ListView:
//自定义提示框
Popup {
id: control
contentItem: ListView {
id: item_list
delegate: Rectangle{
Text{
}
MouseArea{
anchors.fill: parent
}
}
}
}
点击账号输入框右侧下拉按钮弹出:
根据选择的账号去查询用户密码,设置到输入框中。
(4)另外,给表单Rectangle区域加了一个阴影,结果发现阴影和Rect都放在Row布局就乱了,于是用Item把阴影和Rect包裹了一层:
剩下的就是样式设置和交互逻辑了。
2.代码链接
代码GitHub:https://github.com/gongjianbo/MyTestCode.git
代码码云:https://gitee.com/gongjianbo/MyTestCode
(代码目录:/Qml/QmlLoginPage)
图标来自阿里图标库:https://www.iconfont.cn/