第三代软件开发-实现需求长时间未操作返回登录界面

简介: 欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资

头图

第三代软件开发-实现需求长时间未操作返回登录界面

[toc]

关键字: QtQmlQTimertimeouteventFilter

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

实现需求长时间未操作返回登录界面

实现思路

在主窗口类中定义一个计时器对象QTimer *timer和一个时间间隔,用于记录用户最后一次操作的时间。

QTimer *timer;
int idleTime;

在构造函数中初始化计时器,并连接计时器的timeout()信号到一个槽函数。

timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::checkIdleTime);

在主窗口类中实现一个事件过滤器函数eventFilter(),用于监测用户的操作事件。在该函数中,如果接收到鼠标点击、键盘按键或移动事件,则更新计时器记录的时间。

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress || event->type() == QEvent::MouseButtonPress ||
        event->type() == QEvent::MouseMove)
    {
        idleTime = 0; // 重置计时
    }
    return QObject::eventFilter(obj, event);
}

在主窗口的showEvent()函数中设置事件过滤器,以便开始监测用户操作事件。

void MainWindow::showEvent(QShowEvent *event)
{
    QWidget::showEvent(event);
    qApp->installEventFilter(this);
    idleTime = 0; // 重置计时
    timer->start(1000); // 启动计时器,每秒触发一次 timeout() 信号
}

实现槽函数checkIdleTime(),在该函数中检查空闲时间是否超过设定的阈值。如果超过,则显示登录界面,并停止计时器。

void MainWindow::checkIdleTime()
{
    idleTime++;
    if (idleTime >= MAX_IDLE_TIME)
    {
        qApp->removeEventFilter(this); // 停止事件过滤器
        timer->stop(); // 停止计时器
        // 显示登录界面的代码
        showLoginDialog();
    }
}

通过以上步骤,我们可以实现长时间未操作后返回登录界面的功能。在用户进行任何操作时,会重置计时器的时间;若用户在一段时间内没有操作,计时器会超过预设的阈值,触发返回登录界面的操作。需要根据实际情况自行调整MAX_IDLE_TIME的值,以秒为单位。同时,需要在主窗口类中添加与登录界面相关的自定义函数showLoginDialog(),来显示登录界面。

如果你碰巧看来我上一篇文章【第三代软件开发-TabView】,而且你还看我的另外一篇已经发表的文章https://blog.csdn.net/z609932088/article/details/130926692?spm=1001.2014.3001.5501

image-20230728225427116

那么就已经知道怎么做了吧。

用户操作监控

用户能操作什么呢,键鼠和触屏,应该没有其他的吧,所以咱们这里只需要处理这些,这部分在我上一篇已经发布的博文中已经说了,咱们直接就附代码凑字数了。

bool XXXX::eventFilter(QObject *obj, QEvent *event)
{
    /**
     * 捕获键盘事件
     **/
    if( event->type() == QEvent::KeyPress ||                    // 键盘按下
        event->type() == QEvent::MouseMove ||                   // 鼠标移动
        event->type() == QEvent::MouseButtonPress ||            // 鼠标按键按下
        event->type() == QEvent::Wheel ||                       // 鼠标滚轮事件
        event->type() == QEvent::TouchBegin)                    // 屏幕触屏事件
    {
        m_lockScreenTimer->start(m_timerLong);
        setLockScreen(false);
    }
#ifdef QT_NO_DEBUG
    /**
     * 禁止正常关闭程序
     **/
    if(event->type() == QEvent::Close && !m_closeSystem)
        event->ignore();
#endif
    return QObject::eventFilter(obj,event);
}

注意哦,这里是C++的代码,我们需要把这个注册成QML可以识别的模块,这里还有就是要注意,我这个事建过滤器是安装给了QApplication。代码如下

QApplication::instance()->installEventFilter(this);

QML 逻辑处理

    XXXX
    {
        id: keymonitor
        timerLong: UserProfile.screenProtectTime                                     // 屏保时间
        onLockScreenChanged:
        {
            if(tabview_mainFrame.currentIndex === 0)
            {
                if(lockScreen)
                {
                    tabview_mainFrame.getTab(0).item.lockScreen()
                }
                else
                    tabview_mainFrame.getTab(0).item.unLockScreen()
                return
            }
            if(tabview_mainFrame.getTab(1).item)
            {
                if(lockScreen && !(tabview_mainFrame.getTab(1).item.frameIndex === 1 || tabview_mainFrame.getTab(1).item.frameIndex === 0))
                {
                    tabview_mainFrame.currentIndex = 0;
                    tabview_mainFrame.getTab(0).item.lockScreen()
                    tabview_mainFrame.getTab(1).item.signalLockScreen()
                }
                else
                    tabview_mainFrame.getTab(0).item.unLockScreen()
            }
            else
            {
                if(lockScreen)
                {
                    tabview_mainFrame.currentIndex = 0;
                    tabview_mainFrame.getTab(0).item.lockScreen()
                }
                else
                    tabview_mainFrame.getTab(0).item.unLockScreen()
            }
        }
    }

这里不需要咱们做过多解读,因为有部分代码是为了业务,即在某一模式下不能锁屏,就和咱们看电影全屏不能进屏保一个道理。


博客签名2021

相关文章
|
5月前
|
小程序 安全 开发者
【产品上新】彻底解放主账号,开发者也能配置密钥,创建小程序了!
【产品上新】彻底解放主账号,开发者也能配置密钥,创建小程序了!
51 6
|
2月前
|
前端开发 机器人
中后台前端开发问题之复杂交互动作中的新用户和老用户的不同引导方式如何解决
中后台前端开发问题之复杂交互动作中的新用户和老用户的不同引导方式如何解决
27 0
|
11月前
|
小程序 JavaScript 程序员
小程序最新标准授权登录流程+逻辑
小程序最新标准授权登录流程+逻辑
140 0
|
4月前
|
监控 Serverless 开发工具
函数计算产品使用问题之要确保服务能在后台持续运行,而不依赖于WebUI是否打开,该怎么操作
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
运维 Shell 应用服务中间件
【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)
【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)
159 1
|
网络协议
【解决方案 十八】连接已重置怎么办
【解决方案 十八】连接已重置怎么办
1119 0
|
小程序 JavaScript 数据安全/隐私保护
借助云开发5行代码获取小程序用户的手机号
借助云开发5行代码获取小程序用户的手机号
373 0
|
小程序 JavaScript 计算机视觉
无需交 300 元认证费,快速创建已认证的小程序
快速创建小程序接口优化了小程序注册认证的流程,能帮助第三方平台迅速拓展线下商户,拓展商户的服务范围,占领小程序线下商业先机。采用法人人脸识别方式替代小额打款等认证流程,极大的减轻了小程序主体、类目资质信息收集的人力成本。通过该接口创建小程序默认为“已认证”。为降低接入小程序的成本门槛,通过该接口创建的小程序无需交 300 元认证费。
143 0
无需交 300 元认证费,快速创建已认证的小程序
|
数据安全/隐私保护 iOS开发 MacOS
Pd虚拟机安装系统提示 “网络初始化失败 操作失败 ”的解决方案
为近期升级到 macOS 12.x ,导致 PD16.x 又不能用了,于是又找到了 PD17.x,安装很顺利,但是启动具体虚拟机的时候却提示:网络初始化失败
Pd虚拟机安装系统提示 “网络初始化失败 操作失败 ”的解决方案
|
Web App开发
【自然框架】通用权限的视频演示(一):添加角色,权限到功能节点和按钮
写了几个关于权限的东东,好像大家都不大理解,也不太清楚我的权限到底能做什么,所以想来想去还是弄点视频吧,就是屏幕录像,这样大家看起来就方便了吧。      为了大家便于观看视频,我先说一下视频的步骤。
1174 0
下一篇
无影云桌面