【QA】单件模式在Qt中有哪些应用?

news2025/3/24 20:05:31

单例设计模式确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。在 Qt 框架中,有不少类的设计采用了单例模式,以下为你详细介绍并给出相应代码示例。

1. QApplication

QApplication 是 Qt GUI 应用程序的核心类,每个 Qt GUI 应用程序必须有且仅有一个 QApplication 实例,它负责管理应用程序的资源、事件循环等。

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    // 创建 QApplication 实例,这是单例模式的体现
    QApplication app(argc, argv);

    QLabel label("Hello, Qt!");
    label.show();

    return app.exec();
}

在这个示例中,QApplication 以单例形式存在,贯穿整个应用程序的生命周期,负责管理应用程序的事件循环和资源分配。若尝试创建多个 QApplication 实例,程序会出现异常。

2. QCoreApplication

QCoreApplicationQApplication 的基类,用于非 GUI 应用程序。同样,一个应用程序中只能有一个 QCoreApplication 实例。

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    // 创建 QCoreApplication 实例
    QCoreApplication app(argc, argv);

    qDebug() << "Application is running.";

    return app.exec();
}

此代码展示了在非 GUI 应用程序中,QCoreApplication 以单例形式存在,管理应用程序的核心功能,如事件处理和信号槽机制。

3. QSettings

QSettings 用于读写应用程序的配置信息,虽然它本身不是严格意义上的单例类,但开发者常将其封装成单例来实现全局唯一的配置管理。不过,Qt 本身提供了全局访问的便捷方式。

#include <QCoreApplication>
#include <QSettings>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 使用 QSettings 读写配置信息
    QSettings settings("MyCompany", "MyApp");
    settings.setValue("key", "value");

    QString value = settings.value("key").toString();
    qDebug() << "Value read from settings:" << value;

    return app.exec();
}

在这个例子里,QSettings 可用于在应用程序的不同部分读写配置信息,确保配置信息的一致性和全局可访问性。

4. QThreadPool

QThreadPool 管理和复用线程,减少线程创建和销毁的开销。QThreadPool::globalInstance() 提供了全局线程池的单例访问方式。

#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <QDebug>

class MyTask : public QRunnable
{
public:
    void run() override
    {
        qDebug() << "Task is running in thread:" << QThread::currentThreadId();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 获取全局线程池的单例实例
    QThreadPool *pool = QThreadPool::globalInstance();

    MyTask *task = new MyTask();
    task->setAutoDelete(true);

    // 将任务添加到线程池执行
    pool->start(task);

    // 等待任务完成
    pool->waitForDone();

    return app.exec();
}

这里,QThreadPool::globalInstance() 返回的是全局唯一的线程池实例,可在应用程序的不同地方使用该线程池来执行任务。

5. QDesktopServices

QDesktopServices 提供了与桌面环境交互的功能,如打开文件、邮件客户端等。它以单例方式提供全局服务。

#include <QCoreApplication>
#include <QDesktopServices>
#include <QUrl>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 使用 QDesktopServices 打开网页
    QDesktopServices::openUrl(QUrl("https://www.qt.io"));

    return app.exec();
}

此示例中,QDesktopServices 以单例形式提供全局服务,方便开发者在应用程序中调用桌面环境的功能。

6. QFileOpenEventQGuiApplication

在处理文件打开事件时,QGuiApplication 作为单例存在,管理应用程序的 GUI 相关功能,包括文件打开事件的处理。

#include <QGuiApplication>
#include <QFileOpenEvent>
#include <QDebug>

class MyApplication : public QGuiApplication
{
public:
    MyApplication(int &argc, char **argv) : QGuiApplication(argc, argv) {}

protected:
    bool event(QEvent *event) override
    {
        if (event->type() == QEvent::FileOpen) {
            QFileOpenEvent *fileEvent = static_cast<QFileOpenEvent *>(event);
            qDebug() << "Opening file:" << fileEvent->file();
            return true;
        }
        return QGuiApplication::event(event);
    }
};

int main(int argc, char *argv[])
{
    MyApplication app(argc, argv);

    return app.exec();
}

在这个例子中,MyApplication 继承自 QGuiApplication,通过重写 event 方法处理文件打开事件。QGuiApplication 以单例形式存在,确保整个应用程序对 GUI 相关事件的统一管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

logisim安装以及可能出现的问题

阅读提示&#xff1a;我这篇文章更偏向于安装出现问题的解决方案 目录 一、安装步骤 二、安装问题 1、出错的问题 2、出错的原因与解决方法 一、安装步骤 1、下载logisim 官方网站&#xff1a;https://sourceforge.net/projects/circuit/ 下载适用于你操作系统的版本&…

Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发

DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序&#xff0c;必须通过Servlet来处理 没有Servlet&#xff0c;java是无法处理web请求的 Web交互&#xff1a; 接收请求HttpServletRequest&#xff1a;可以获取到请求的信息&#xff0c;比如uri&#…

hackmyvm-Icecream

arp-scan -l nmap -sS -v 192.168.222.106 enum4linux 192.168.222.106 445端口 smbmap -H 192.168.222.106 icecream为只读模式 smbclient \\192.168.222.106\icecream 反弹shell(上传put php-reverse-shell.php) 开启监听 nc -lnvp 1234 拿到webshell cat /etc/passwd 9000端…

告别低效人工统计!自动计算计划进度

实时监控任务进度一直是项目管理中的一项巨大挑战。 人工统计方式不仅耗时耗力&#xff0c;而且往往由于信息传递的延迟和人为误差&#xff0c;导致无法实时获得准确的项目进展信息。 这种不准确性可能掩盖潜在的风险点&#xff0c;从而影响项目的整体进度和成果。 Ganttable …

AI比人脑更强,因为被植入思维模型【16】反脆弱

毛选中就有言&#xff0c;不经历困难&#xff0c;我们就不会掌握战胜困难的方法。 这个世界纷繁复杂&#xff0c;不是强者总是运气好&#xff0c;而是他们能够失败后快速复原&#xff0c;不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…

L2TP实验

放开安全策略机制&#xff0c;FW1不配IP [FW1]firewall zone trust [FW1-zone-trust]add interface GigabitEthernet 1/0/0 [FW1]security-policy [FW1-policy-security]default action permit FW2 和FW3 [FW2]interface g1/0/1 [FW2-GigabitEthernet1/0/1]ip address 2…

【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 …

【记录一下】LMDeploy学习笔记及遇到的问题

LMDeploy 是一个用于大型语言模型&#xff08;LLMs&#xff09;和视觉-语言模型&#xff08;VLMs&#xff09;压缩、部署和服务的 Python 库。 其核心推理引擎包括 TurboMind 引擎和 PyTorch 引擎。前者由 C 和 CUDA 开发&#xff0c;致力于推理性能的优化&#xff0c;而后者纯…

HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述

这个是上一年的项目&#xff0c;之前弄得不怎么完整&#xff0c;只有一个openmv的&#xff0c;所以openmv自己去我主页找&#xff0c;这篇主要讲蓝牙 这个是我在使用openmv连接单片机1然后单片机1与单片机2通过蓝牙进行通信 最终实现的效果是&#xff1a;openmv识别到图形和数…

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…

OpenLayers集成天地图服务开发指南

以下是一份面向GIS初学者的OpenLayers开发详细教程&#xff0c;深度解析代码&#xff1a; 一、开发环境搭建 1.1 OpenLayers库引入 <!-- 使用CDN引入最新版OpenLayers --> <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/ollatest/ol.c…

VBA-Excel

VBA 一、数据类型与变量 常用数据类型&#xff1a; Byte&#xff1a;字节型&#xff0c;0~255。Integer&#xff1a;整数型&#xff0c;用于存储整数值&#xff0c;范围 -32768 到 32767。Long&#xff1a;长整型&#xff0c;可存储更大范围的整数&#xff0c;范围 -214748364…

OpenHarmony 开源鸿蒙北向开发——linux使用make交叉编译第三方库

这几天搞鸿蒙&#xff0c;需要编译一些第三方库到鸿蒙系统使用。 头疼死了&#xff0c;搞了一个多星期总算搞定了。 开贴记坑。 一、SDK下载 1.下载 在linux下使用命令 wget https://cidownload.openharmony.cn/version/Master_Version/OpenHarmony_5.1.0.54/20250313_02…

【第14届蓝桥杯C/C++B组省赛】01串的熵

问题描述 算法思想 首先分析题目中给出的公式 S 100时&#xff0c;其信息熵为 H(S)−p(0)log2​(p(0)) − p(0)log2​(p(0)) − p(1)log2​(p(1)) 继续化简公式得 设0出现的次数为x&#xff0c;1出现的次数为3-x H(S)−x * p(0) * log2​(p(0)) − (3-x) * p(1) * log2​(p(1)…

鸿蒙harmonyOS笔记:练习CheckBoxGroup获取选中的值

除了视觉效果实现全选和反选以外&#xff0c;咱们经常需要获取选中的值&#xff0c;接下来看看如何实现。 核心步骤&#xff1a; 1. 给 CheckBoxGroup 注册 onChange。 2. CheckBox 添加 name 属性。 3. 在 onChange 的回调函数中获取 选中的 name 属性。 事件&#xff1a…

收数据花式画图plt实战

目录 Python plt想把纵坐标化成对数形式代码 子图ax. 我又有ax scatter&#xff0c;又有ax plot&#xff0c;都要去对数 数字接近0&#xff0c;取对数没有定义&#xff0c;怎么办 创建数据 添加一个小的常数以避免对数未定义的问题 创建一个figure和一个子图ax 在子图a…

系统架构书单推荐(一)领域驱动设计与面向对象

本文主要是个人在学习过程中所涉猎的一些经典书籍&#xff0c;有些已经阅读完&#xff0c;有些还在阅读中。于我而言&#xff0c;希望追求软件系统设计相关的原则、方法、思想、本质的东西&#xff0c;并希望通过不断的学习、实践和积累&#xff0c;提升自身的知识和认知。希望…

Centos6配置yum源

Centos6配置yum源 为Centos6配置CentOS Vault源—防止yum源过期为Centos6配置epel源为Centos6配置ELRepo源---已ELRepo被官方清空Centos6安装dockerdocker配置国内镜像加速 为Centos6配置CentOS Vault源—防止yum源过期 参考&#xff1a;https://mirrors.ustc.edu.cn/help/cen…

CVPR 2025 | 文本和图像引导的高保真3D数字人高效生成GaussianIP

小小宣传一下CVPR 2025的工作GaussianIP。 arXiv&#xff1a;https://arxiv.org/abs/2503.11143 Github&#xff1a;https://github.com/silence-tang/GaussianIP 欢迎star, issue~ 摘要 文本引导的3D人体生成随着高效3D表示及2D升维方法&#xff08;如SDS&#xff09;的发展…

Cursor从小白到专家

文章目录 1&#xff1a;简单开发一个贪吃蛇游戏规则设置提示词 cursor开发小工具开发整体步骤创建.cursorrules输入提示词composer模式chat模式 执行cursor accept all发布到线上进行分享 cursor开发一个浏览器插件创建.cursorrulescursor rules范例集工具 输入提示词执行curso…