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


    头图

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


    关键字: QtQmlQTimertimeouteventFilter

    项目介绍

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

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

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

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

    重要说明☝

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

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

    实现思路

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

    QTimer *timer;
    int idleTime;
    
    • 1
    • 2

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

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

    在主窗口类中实现一个事件过滤器函数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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

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

    void MainWindow::checkIdleTime()
    {
        idleTime++;
        if (idleTime >= MAX_IDLE_TIME)
        {
            qApp->removeEventFilter(this); // 停止事件过滤器
            timer->stop(); // 停止计时器
            // 显示登录界面的代码
            showLoginDialog();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过以上步骤,我们可以实现长时间未操作后返回登录界面的功能。在用户进行任何操作时,会重置计时器的时间;若用户在一段时间内没有操作,计时器会超过预设的阈值,触发返回登录界面的操作。需要根据实际情况自行调整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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

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

    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()
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

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


    博客签名2021
  • 相关阅读:
    【Mysql系列】03_系统设计
    超详细的Pycharm.2023下载与安装教程
    Go 接口和多态
    VR系统的开发流程
    《设计模式:可复用面向对象软件的基础》——行为模式(3)(笔记)
    Django常见面试题总结(二)
    C#操作MySQL从入门到精通(18)——使用组合查询
    青藏高原连续日光诱导叶绿素荧光数据集(2000-2018)
    .NET开源、功能强大、跨平台的图表库 - LiveCharts2
    电路分析答疑 1
  • 原文地址:https://blog.csdn.net/z609932088/article/details/133971218