单例模式(下)

文章目录

文章介绍

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

步骤安排及单例讲解

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 中的单例类型

cpp 复制代码
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#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)

cpp 复制代码
#ifndef KEYBOARDINPUTMANAGER_H
#define KEYBOARDINPUTMANAGER_H

#include <QObject>

// 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)

cpp 复制代码
#include "KeyboardInputManager.h"
#include <QGuiApplication>
#include <QKeyEvent>

// 构造函数:安装事件过滤器以捕获键盘事件
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)

cpp 复制代码
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

相关推荐
云小逸10 小时前
【 VS2013 集成 Qt5.7.1 踩坑记录:moc/uic/rcc 报“系统找不到指定的路径”怎么解决?】
开发语言·windows·qt
努力努力再努力wz11 小时前
【Qt入门系列】深入理解信号与槽:从事件响应到自定义信号机制
c语言·开发语言·数据结构·数据库·c++·qt·mysql
mengzhi啊11 小时前
串口数据监控软件开发总结
qt
小短腿的代码世界12 小时前
Qwt实时FFT频谱分析深度解析:从信号采集到可视化渲染的完整架构设计
前端·qt·架构·交互
Hua-Jay12 小时前
OpenCV联合C++/Qt 学习笔记(二十)----Harri角点检测、Shi-Tomas角点检测及亚像素级别角点位置优化
c++·笔记·qt·opencv·学习·计算机视觉
十五年专注C++开发12 小时前
QFluentKit: 一个基于 Qt Widgets 的 Fluent Design 风格 UI 组件库
开发语言·c++·qt·ui·qfluentkit
Hua-Jay12 小时前
OpenCV联合C++/Qt 学习笔记(十九)----图像分割
c++·笔记·qt·opencv·学习
小短腿的代码世界13 小时前
Qt位置服务深度解析:从GPS定位到地理围栏的完整架构设计
开发语言·qt
史迪仔011213 小时前
[QML] Qt5/6图像色彩空间处理
开发语言·前端·c++·qt
小短腿的代码世界13 小时前
传感器暗战:Qt Sensors如何让桌面应用“感知“物理世界?
开发语言·qt