單例模式(下)

文章目錄

  • 文章介紹
  • 步驟安排及單例講解
  • 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

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36762.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

雷卯一站式解決電子設備靜電浪涌與接口安全

在快速演進的數字時代&#xff0c;電子設備不僅是日常生活的核心&#xff0c;更是工業自動化、智能穿戴、智能家居乃至未來交通的基石。然而&#xff0c;隨著技術邊界的不斷拓展&#xff0c;設備面臨的挑戰也日益嚴峻&#xff0c;尤其是來自靜電放電(ESD)、浪涌沖擊及電磁干擾的…

【2024最新華為OD-C/D卷試題匯總】[支持在線評測] 特殊加密算法(200分) - 三語言AC題解(Python/Java/Cpp)

&#x1f36d; 大家好這里是清隆學長 &#xff0c;一枚熱愛算法的程序員 ? 本系列打算持續跟新華為OD-C/D卷的三語言AC題解 &#x1f4bb; ACM銀牌&#x1f948;| 多次AK大廠筆試 &#xff5c; 編程一對一輔導 &#x1f44f; 感謝大家的訂閱? 和 喜歡&#x1f497; &#x1f…

Rust 跨平臺-Android 和鴻蒙 OS

1. 安裝 rustup rustup 是 Rust 的安裝和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 該命令會安裝 rusup 和最新的穩定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 編譯器&#xff0c;用于將 Rust 代碼編譯成可執行文件或庫。 ca…

技術速遞|Visual Studio Code 的 .NET MAUI 擴展現已正式發布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我們非常高興地宣布 .NET MAUI VS Code 擴展插件結束了預覽階段&#xff0c;并將包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 擴展插件&…

GuLi商城-商品服務-API-三級分類-刪除-頁面效果

一步步學習Vue太慢了&#xff0c;準備跳過前端的學習&#xff0c;直接使用前端完整的項目 下載依賴npm install&#xff0c;會報錯&#xff0c;排查了好久 我安裝的是Node14&#xff0c;所以必須要安裝4.14 Vscode終端輸入&#xff1a;npm install node-sass4.14 輸入&#x…

【Android面試八股文】如果需要在Activity間傳遞大量的數據怎么辦?

文章目錄 1. 使用Intent傳遞數據2. 使用靜態變量3. 使用Parcelable或Serializable接口4. 使用文件5. 使用數據庫存儲6. 使用ContentProvider7. 匿名共享內存(Ashmem)總結在Android開發中,如果需要在Activity之間傳遞大量數據,可以采取以下幾種方法: 1. 使用Intent傳遞數據…

【博士每天一篇文獻-綜述】A survey on few-shot class-incremental learning

閱讀時間&#xff1a;2023-12-19 1 介紹 年份&#xff1a;2024 作者&#xff1a;田松松&#xff0c;中國科學院半導體研究所&#xff1b;李璐思&#xff0c;老道明大學助理教授&#xff1b;李偉軍&#xff0c;中國科學院半導體研究所AnnLab&#xff1b; 期刊&#xff1a; Neu…

LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 進行離屏渲染

系列文章目錄 LearnOpenGL 筆記 - 入門 01 OpenGLLearnOpenGL 筆記 - 入門 02 創建窗口LearnOpenGL 筆記 - 入門 03 你好&#xff0c;窗口LearnOpenGL 筆記 - 入門 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 與 VBO 之間的關系LearnOpenGL - Android OpenGL ES 3.0 繪制…

《Windows API每日一練》6.4 程序測試

前面我們討論了鼠標的一些基礎知識&#xff0c;本節我們將通過一些實例來講解鼠標消息的不同處理方式。 本節必須掌握的知識點&#xff1a; 第36練&#xff1a;鼠標擊中測試1 第37練&#xff1a;鼠標擊中測試2—增加鍵盤接口 第38練&#xff1a;鼠標擊中測試3—子窗口 第39練&…

3.imput 字符串常用方法 字符串倒序,切片

1.input input()函數接收一個標準輸入數據返回string類型 2.字符串常用方法 upper()將字符串中的小寫字母變為大寫 lower()大寫變小寫 len()獲取長度 count(子字符串)統計某個字符出現的次數 index(子字符串)可以返回子字符串出現的位置, rindex從右邊找 find(子字符串)可以返回…

vite-ts-cesium項目集成mars3d修改相關的包和配置參考

如果vite技術棧下使用原生cesium&#xff0c;請參考下面文件的包和配置修改&#xff0c;想用原生創建的viewer結合我們mars3d的功能的話。 1. package.json文件 "dependencies": {"cesium": "^1.103.0","mars3d": "^3.7.18&quo…

重啟ubuntu后命令行出現(initramfs),無圖形界面問題。

由于ubuntu內部軟件問題&#xff0c;需要重啟ubuntu&#xff0c;導致重啟后圖像界面消失&#xff0c;出現如下的命令行&#xff1a; (initramfs): 這里表示進入圖形界面初始化時&#xff0c;某個分區的文件損壞&#xff0c;損壞文件名稱會在上方顯示。 解決方法&#xff1a;…

深度學習 - Transformer 組成詳解

整體結構 1. 嵌入層&#xff08;Embedding Layer&#xff09; 生活中的例子&#xff1a;字典查找 想象你在讀一本書&#xff0c;你不認識某個單詞&#xff0c;于是你查閱字典。字典為每個單詞提供了一個解釋&#xff0c;幫助你理解這個單詞的意思。嵌入層就像這個字典&#xf…

Micrometer+ZipKin分布式鏈路追蹤

目錄 背景MicrometerMicrometer與ZipKin之間的關系專業術語分布式鏈路追蹤原理 ZipKin安裝下載 MicrometerZipKin 案例演示相關文獻 背景 一個系統頁面上的按鈕點擊到結果反饋&#xff0c;在微服務框架里&#xff0c;是由N個服務組成返回結果&#xff0c;中間可能經過a->b-…

【Electron】Electron入門實現

Electron 學習筆記 Electron 是一個開源框架&#xff0c;允許開發者使用網頁技術&#xff08;HTML、CSS 和 JavaScript&#xff09;來構建跨平臺的桌面應用程序。它由 GitHub 開發并維護&#xff0c;最初是為了支持開發 Atom 編輯器。Electron 結合了 Chromium&#xff08;用于…

密碼學及其應用 —— 對稱加密技術

1. 對稱加密、流加密和塊加密 1.1 對稱加密 對稱加密&#xff08;也稱為密鑰加密&#xff09;是一種加密方式&#xff0c;其中加密和解密使用相同的密鑰。這種加密方法基于二進制層面的操作&#xff0c;如XOR&#xff08;異或&#xff09;、SHIFT&#xff08;位移&#xff09;…

Redis Stream Redisson Stream

目錄 一、Redis Stream1.1 場景1&#xff1a;多個客戶端可以同時接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;發消息 &#xff09;1.1.2 XREAD - 從stream中讀取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 從stream指定區間讀取Entry&#xff08;收消息&…

【DevExpress】WPF DevExpressMVVM 24.1版本開發指南

DevExpressMVVM WPF 環境安裝 前言重要Bug&#xff08;必看&#xff09;環境安裝控件目錄Theme 主題LoginWindow 登陸窗口INavigationService 導航服務DockLayout Dock類型的畫面布局TreeView 樹狀列表注意引用類型的時候ImageSource是PresentationCore程序集的博主找了好久&am…

[筆記] keytool 導入服務器證書和證書私鑰

背景 我當前手頭已有一個服務器證書和對應的私鑰&#xff0c;現在需要轉換為 Java KeyStore 格式使用&#xff0c;找了一大圈才發現 keytool 無法直接導入服務器證書和私鑰&#xff0c;當然證書可以直接導入&#xff0c;但是私鑰是無法直接導入。找了一大圈發現可以先將服務器…

LeetCode題解:1669. 合并兩個鏈表,JavaScript,詳細注釋

原題鏈接&#xff1a; https://leetcode.cn/problems/merge-in-between-linked-lists/ 解題思路&#xff1a; 注意該題傳入的a和b是鏈表的索引&#xff0c;而不是節點的值先遍歷list1&#xff0c;找到a-1和b1節點將a-1的next指向list2的頭節點在將list2的尾節點的next指向b1節…