单例模式(下)

文章目录

文章介绍

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

步骤安排及单例讲解

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

相关推荐
ShineWinsu8 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
进击的荆棘2 天前
Linux系统——线程同步与互斥之线程池和安全
linux·运维·服务器·安全·单例模式·线程
慧都产品智能化3 天前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu3 天前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu3 天前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
ShineWinsu4 天前
对于Qt:QDial常见属性以及信号的解析
开发语言·c++·qt·gui·客户端·旋钮·qdial
宛 禾4 天前
Qt 事件系统完全指南:从事件循环到实战避坑
qt
敲上瘾4 天前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
MOONICK5 天前
QT元数据
开发语言·qt
橙橙笔记5 天前
QT的学习第四部分
linux·qt·学习·音视频