QML实现一个登录框

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/

发布了95 篇原创文章 · 获赞 26 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/gongjianbo1992/article/details/102753985
今日推荐