• 单例模式(下)


    文章介绍

    给一个单例模式的例子,实现将键盘输入数据打印到界面文本框的操作

    步骤安排及单例讲解

    step1:注册单例类型(main.cpp)
    step2:定义类和私有构造函数(keyboardinputmanager.h)
    step3:(keyboardinputmanager.cpp)
    step4:在qml中调用keyboardinputmanager类(main.qml)
    单例模式的优点:非常适合在 QML 中集成复杂的后端逻辑,使得前端界面可以直接调用后端逻辑的单例实例进行数据处理或业务逻辑运算。

    step1:注册单例类型(main.cpp)

    main.cpp中只用关注 qmlRegisterSingletonInstance("com.example", 1, 0, "KeyboardInputManager", KeyboardInputManager::instance());;
    这行代码将 KeyboardInputManager注册为 QML 中的单例类型

    #include 
    #include 
    #include 
    #include "KeyboardInputManager.h"
    
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        qmlRegisterSingletonInstance("com.example", 1, 0, "KeyboardInputManager", KeyboardInputManager::instance());
    
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        return app.exec();
    }
    

    step2:定义类和私有构造函数(keyboardinputmanager.h)

    #ifndef KEYBOARDINPUTMANAGER_H
    #define KEYBOARDINPUTMANAGER_H
    
    #include 
    
    // KeyboardInputManager 类:管理键盘输入的单例类
    class KeyboardInputManager : public QObject
    {
        Q_OBJECT
    public:
        // 获取单例实例的方法
        static KeyboardInputManager* instance()
        {
            // 静态局部变量,确保单例
            static KeyboardInputManager instance;
            return &instance;
        }
    
    signals:
        // 按键事件信号,传递按键文本
        void keyPressed(const QString &key);
    
    protected:
        // 事件过滤器方法,用于捕获和处理键盘事件
        bool eventFilter(QObject *obj, QEvent *event) override;
    
    private:
        // 私有构造函数,确保单例模式
        KeyboardInputManager();
        // 私有析构函数
        ~KeyboardInputManager();
        // 禁用拷贝构造函数
        KeyboardInputManager(const KeyboardInputManager&) = delete;
        // 禁用赋值运算符
        KeyboardInputManager& operator=(const KeyboardInputManager&) = delete;
    };
    
    #endif // KEYBOARDINPUTMANAGER_H
    
    
    
    

    step3:(keyboardinputmanager.cpp)

    #include "KeyboardInputManager.h"
    #include 
    #include 
    
    // 构造函数:安装事件过滤器以捕获键盘事件
    KeyboardInputManager::KeyboardInputManager()
    {
        // 安装事件过滤器,将当前实例作为事件过滤器
        QGuiApplication::instance()->installEventFilter(this);
    }
    
    // 析构函数:默认析构函数
    KeyboardInputManager::~KeyboardInputManager() {}
    
    // 事件过滤器:捕获并处理键盘事件
    bool KeyboardInputManager::eventFilter(QObject *obj, QEvent *event)
    {
        // 检查事件类型是否为键盘按下事件
        if (event->type() == QEvent::KeyPress) {
            // 将事件转换为键盘事件
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            // 发射 keyPressed 信号,将按键文本传递给连接的槽函数
            emit keyPressed(keyEvent->text());
            // 返回 true 表示事件已处理
            return true;
        } else {
            // 调用父类的事件过滤器处理其他类型的事件
            return QObject::eventFilter(obj, event);
        }
    }
    
    
    

    step4:在qml中调用keyboardinputmanager类(main.qml)

    import QtQuick 2.15
    import QtQuick.Controls 2.15
    import QtQuick.Window 2.15
    import com.example 1.0
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Keyboard Input")
    
        TextArea {
            id: textArea
            anchors.fill: parent
            wrapMode: Text.Wrap
            focus: true
            Keys.onPressed: {
                KeyboardInputManager.keyPressed(event.text)
            }
        }
    
        Connections {
            target: KeyboardInputManager
    
            onKeyPressed: {
                textArea.text += key
            }
        }
    }
    
    

    重点步骤

    main.cpp

    在这里插入图片描述

    keyboardinputmanager.h

    在这里插入图片描述

    keyboardinputmanager.cpp

    在这里插入图片描述

    main.qml

    在这里插入图片描述

  • 相关阅读:
    Notify
    【LeetCode】Day104-无重叠区间
    宇视网络视频录像机升级步骤
    【Docker 那些事儿】如何安全地停止、删除容器
    php算法面试题及答案
    java并发编程
    如何让虚拟角色自然融入现实?
    流水线作业
    二维码智慧门牌管理系统升级解决方案:一级属性 & 二级属性
    LCD1602液晶显示屏介绍和程序开发
  • 原文地址:https://blog.csdn.net/summer__7777/article/details/140012418