当前位置: 首页 > news >正文

单例模式(下)

文章目录

  • 文章介绍
  • 步骤安排及单例讲解
  • step1:注册单例类型(main.cpp)
  • step2:定义类和私有构造函数(keyboardinputmanager.h)
  • step3:(keyboardinputmanager.cpp)
  • step4:在qml中调用keyboardinputmanager类(main.qml)
  • 重点步骤
    • main.cpp
    • keyboardinputmanager.h
    • keyboardinputmanager.cpp
    • main.qml

文章介绍

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

步骤安排及单例讲解

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

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

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

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
import com.example 1.0Window {visible: truewidth: 640height: 480title: qsTr("Keyboard Input")TextArea {id: textAreaanchors.fill: parentwrapMode: Text.Wrapfocus: trueKeys.onPressed: {KeyboardInputManager.keyPressed(event.text)}}Connections {target: KeyboardInputManageronKeyPressed: {textArea.text += key}}
}

重点步骤

main.cpp

在这里插入图片描述

keyboardinputmanager.h

在这里插入图片描述

keyboardinputmanager.cpp

在这里插入图片描述

main.qml

在这里插入图片描述

相关文章:

单例模式(下)

文章目录 文章介绍步骤安排及单例讲解step1&#xff1a;注册单例类型&#xff08;main.cpp&#xff09;step2&#xff1a;定义类和私有构造函数&#xff08;keyboardinputmanager.h&#xff09;step3:&#xff08;keyboardinputmanager.cpp&#xff09;step4&#xff1a;在qml中…...

合约期VS优惠期,搞明白他们的区别才能避免很多坑!

在购买流量卡时&#xff0c;相信大家也都发现了&#xff0c;市面上的不少套餐都是有合约期和优惠期的&#xff0c;尤其是联通和移动&#xff0c;那么&#xff0c;什么是合约期&#xff1f;什么又是优惠期呢&#xff1f; ​ 其实&#xff0c;目前很多在网上办理的大流量卡都是有…...

函数式反应式编程(FRP)在Scala中的实践与探索

函数式反应式编程&#xff08;Functional Reactive Programming&#xff0c;简称FRP&#xff09;是一种编程范式&#xff0c;它结合了函数式编程&#xff08;Functional Programming&#xff0c;FP&#xff09;的声明式特性和反应式编程&#xff08;Reactive Programming&#…...

NGINX配置web文件服务

一、需求描述 系统需要提供文件&#xff08;pdf、图片&#xff09;等上传后支持预览功能。 二、实现方式 2.1 文件权限配置 chmod arwx -R public/chmod 是更改文件权限的命令。-R 是递归选项&#xff0c;表示更改目录及其所有子目录和文件的权限。arwx 是权限设置&#xf…...

deepspeed docker集群实现多机多卡训练----问题记录及解决方案资源汇总

. Docker中实现Deepspeed多机多卡训练 【掘金-雨田君的记事本】docker容器中deepspeed多机多卡集群分布式训练大模型 . 问题记录及解决方案资源汇总 问题1&#xff1a;deepspeed socketStartConnect: Connect to 172.18.0.3<54379> failed : Software caused connectio…...

恢复 IntelliJ IDEA 中消失的菜单栏

要恢复 IntelliJ IDEA 中消失的菜单栏&#xff0c;可以按照以下简单步骤操作&#xff1a; 使用快捷键打开搜索&#xff1a;首先&#xff0c;双击 Shift 键打开全局搜索对话框。 搜索“Menu”&#xff1a;在搜索框中输入 menu&#xff0c;然后从搜索结果中选择与“Main Menu”相…...

漏洞利用开发基础学习记录

文章目录 简介Win32缓冲区溢出内容难点 SEH 溢出内容难点 Egg Hunters内容难点 Unicode 溢出内容难点 x86-64 缓冲区溢出内容难点 参考资料 简介 本文基于ERC.Xdbg漏洞分析文章进行初步归纳整理&#xff0c;主要有Win32 缓冲区溢出、SEH 溢出、Egg Hunters、Unicode 溢出、x86…...

云通SIPX,您的码号资源智能调度专家!

在数字化转型的浪潮中&#xff0c;号码资源作为企业与客户沟通的重要桥梁&#xff0c;其管理效率直接关系到企业运营的成败。随着运营商对号码资源管理的规范化和精细化&#xff0c;企业对高效、智能的号码资源管理需求日益增长&#xff0c;以实现对外呼叫的降本增效。 一、什么…...

04-Mysql 索引,事务

MySQL 索引介绍 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据十分庞大的时候&#xff0c;索引可以大大加快查询的速度。这是因为使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行…...

U盘提示格式化怎么搞定?本文有5种方法(内含教程)

U盘提示格式化是一种常见故障&#xff0c;即&#xff1a;当U盘插入电脑后&#xff0c;电脑上弹出对话框&#xff0c;提示该U盘需要格式化才能使用。 接触不良、文件系统损坏、热插拔、感染病毒、芯片损坏等原因都可能导致U盘出现此故障。这时点击“格式化”&#xff0c;大概率会…...

day02-登录模块-主页鉴权

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.分析登录流程1.1传统思路是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页1.2vue-element-admin模板的登录思路&…...

git rebase的使用

没有排版&#xff0c;但是干货 因为项目要求&#xff0c;所以使用rebase指令 我使用的是rebase 的分支变基的功能 情景描述&#xff1a; 一共有两个分支&#xff1a;master owner 我在owner分枝上开发&#xff0c;有好多次commit master上也有同事在正常commit&#xff0c; …...

LICEcap-开源GIF 屏幕录制工具

LICEcap-开源GIF 屏幕录制工具 开源GIF 屏幕录制工具 下载可以访问&#xff1a;https://www.cockos.com/licecap/ 点击Record&#xff0c;开始录制 点击Stop&#xff0c;停止录制 点击Record&#xff0c;进入该页面 display in animation&#xff08;在动画中显示&#xff09; …...

【Java Web】会话管理

目录 一、为什么需要会话管理&#xff1f; 二、会话管理机制 三、Cookie概述 四、HttpSession概述 4.1 HttpSession时效性 一、为什么需要会话管理&#xff1f; HTTP协议在设计之初就是无状态的&#xff0c;所谓无状态就是在浏览器和服务器之间的通信过程中&#xff0c;服务器并…...

RestTemplate修改默认转换器,使用FastJsonConverter

问题描述&#xff1a; 在使用RestTemplate发送POST请求时&#xff0c;发现发送的数据并未按配置的JSONField转换&#xff0c;导致服务方一直收不到参数 排查过程&#xff1a; 将itemList改成Items传输即可 原因分析&#xff1a; RestTemplate有默认的转换器&#xff0c;所以…...

什么是div移动指令?如何用vue自定义指令实现?

目录 一、Vue.js框架介绍二、vue自定义指令directive三、什么是div移动指令四、使用vue自定义指令directive写一个div移动指令 一、Vue.js框架介绍 Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它设计得非常灵活&#xff0c;可以轻松地被集成到现有的项目中&#xf…...

Golang | Leetcode Golang题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; const L 10 var bin map[byte]int{A: 0, C: 1, G: 2, T: 3}func findRepeatedDnaSequences(s string) (ans []string) {n : len(s)if n < L {return}x : 0for _, ch : range s[:L-1] {x x<<2 | bin[byte(ch)]}cnt : map[int]in…...

智能猫砂盆到底是不是智商税?解救上班族双手的测评合集来了

不得不说&#xff0c;像我这样的上班族真的是很需要一个智能猫砂盆了。普通的猫砂盆一天就要打扫3次&#xff0c;遇到很能拉的猫咪的时候&#xff0c;就不止是三次那么简单了。如果有个产品能帮我解决这个问题&#xff0c;让我能放心外出&#xff0c;那又何乐而不为呢&#xff…...

java 数据新增、更新、删除监听,并记录日志或其他业务

数据新增、更新、删除监听&#xff0c;并记录日志或其他业务 1.使用场景 日志记录、KPI考核&#xff08;业务进行到某个阶段&#xff0c;对人员的考核&#xff09;等等 实体监听器 实体增加注解 EntityListeners({KpiOrderCounter.class}) /*** 订单管理考核** author sul…...

developer.android.com在国内无法正常访问解决方法

将android.com替换为android.google.cn...

节能模式:OpenClaw+nanobot的间歇性任务调度技巧

节能模式&#xff1a;OpenClawnanobot的间歇性任务调度技巧 1. 为什么需要节能模式 去年夏天&#xff0c;我的电费账单突然飙升。排查后发现&#xff0c;那台24小时运行OpenClaw的工作站竟然是耗电大户——它持续调用着本地部署的Qwen大模型&#xff0c;GPU风扇昼夜不停地呼啸…...

从登录到鉴权:一个前后端分离项目的完整JWT非对称加密配置指南(Vue3 + Spring Boot)

从登录到鉴权&#xff1a;一个前后端分离项目的完整JWT非对称加密配置指南&#xff08;Vue3 Spring Boot&#xff09; 在现代Web应用开发中&#xff0c;前后端分离架构已成为主流选择。这种架构下&#xff0c;如何安全高效地处理用户认证与授权成为一个关键问题。本文将带你从…...

告别无脑抄payload:手把手教你分析RCE-labs靶场PHP源码,自己构造利用链

从源码审计到漏洞利用&#xff1a;深度解析RCE靶场中的PHP代码逻辑 在安全研究领域&#xff0c;真正区分新手与专家的关键能力&#xff0c;往往不是掌握多少现成的攻击载荷&#xff08;payload&#xff09;&#xff0c;而是能否通过源码审计独立发现漏洞并构造利用链。本文将带…...

解决Docker容器中英伟达GPU驱动报错:nvidia-container-toolkit安装指南

1. 为什么Docker容器无法识别英伟达GPU&#xff1f; 最近在帮朋友调试一个深度学习项目时&#xff0c;遇到了一个典型问题&#xff1a;当尝试在Docker容器中运行需要GPU加速的应用时&#xff0c;系统报错提示无法找到NVIDIA驱动。错误信息是这样的&#xff1a; Error response …...

League Akari:英雄联盟玩家的终极效率工具集,免费提升游戏体验

League Akari&#xff1a;英雄联盟玩家的终极效率工具集&#xff0c;免费提升游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …...

GTE文本向量助力智能写作:文本分类与情感倾向双重把关

GTE文本向量助力智能写作&#xff1a;文本分类与情感倾向双重把关 1. 智能写作的核心挑战&#xff1a;内容质量的多维评估 在内容创作领域&#xff0c;我们常常面临一个基本矛盾&#xff1a;如何同时保证文本的专业性和情感表达&#xff1f;传统写作辅助工具往往只能解决单一…...

JPEXS Free Flash Decompiler社区大使选拔流程:申请与评审完全指南

JPEXS Free Flash Decompiler社区大使选拔流程&#xff1a;申请与评审完全指南 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler JPEXS Free Flash Decompiler是一款功能强大的Flash反编译…...

Windows虚拟控制器驱动完全指南:如何用ViGEmBus实现游戏设备模拟

Windows虚拟控制器驱动完全指南&#xff1a;如何用ViGEmBus实现游戏设备模拟 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾因游戏只支持特定手柄而…...

Phi-4-Reasoning-Vision智能助手:医疗影像图文问答系统构建实践

Phi-4-Reasoning-Vision智能助手&#xff1a;医疗影像图文问答系统构建实践 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为医疗影像分析场景优化。该系统能够理解医学影像内容并回答专业问题…...

OpenClaw跨平台脚本:nanobot统一管理mac与Windows文件

OpenClaw跨平台脚本&#xff1a;nanobot统一管理mac与Windows文件 1. 为什么需要跨平台文件管理 在日常工作中&#xff0c;我经常需要在macOS和Windows双系统间切换。最让我头疼的就是文件路径的兼容性问题——macOS使用正斜杠/而Windows使用反斜杠\。每次写脚本都要为不同平…...