标题起的是有点大

主要是工作和学习中,遇到些朋友,怎么说呢,代码不够Qt化

可能是由于他们一开始接触的是 Java MFC 吧

接触 Qt 7个年头了

希望我的系列文章能抛砖引玉吧


单例模式

很多人洋洋洒洒写了一大堆

比如这里 http://xtuer.github.io/qtbook-singleton/

比如这里 http://m.blog.csdn.net/Fei_Liu/article/details/69218935

但是Qt本身就提供了专门的宏 Q_GLOBAL_STATIC

通过这个宏不但定义简单,还可以获得线程安全性。

rule.h

#ifndef RULE_H
#define RULE_H class Rule
{
public:
static Rule* instance();
}; #endif // RULE_H

rule.cpp

#include "rule.h"

Q_GLOBAL_STATIC(Rule, rule)

Rule* Rule::instance()
{
return rule();
}

写法很简单,用法也很简单

在任何地方,引用头文件 include "rule.h"

就可以 Rule::instance()->xxxxxx()


抽象工厂模式

主要是利用 Q_INVOKABLE 和 QMetaObject::newInstance

比如说你有一个Card类 card.h 和 2个派生的类

class Card : public QObject
{
Q_OBJECT
public:
explicit Card();
};
class CentaurWarrunner : public Card
{
Q_OBJECT
public:
Q_INVOKABLE CentaurWarrunner();
};
class KeeperoftheLight : public Card
{
Q_OBJECT
public:
Q_INVOKABLE KeeperoftheLight();
};

然后你写一个 engine.h 和 engine.cpp

#ifndef ENGINE_H
#define ENGINE_H #include <QHash>
#include <QList>
#include <QMetaObject> class Card; class Engine
{
public:
static Engine* instance();
void loadAllCards();
Card* cloneCard(int ISDN); private:
QHash<int, const QMetaObject*> metaobjects;
QList<Card*> allcards;
}; #endif // ENGINE_H
#include "engine.h"
#include "card.h" Q_GLOBAL_STATIC(Engine, engine) Engine* Engine::instance()
{
return engine();
} void Engine::loadAllCards()
{
allcards << new CentaurWarrunner()
<< new KeeperoftheLight();
for (Card* card : allcards)
{
metaobjects.insert(card->getISDN(), card->metaObject());
}
} Card* Engine::cloneCard(int ISDN)
{
const QMetaObject* meta = metaobjects.value(ISDN);
if(meta == nullptr)
{
return nullptr;
}
return qobject_cast<Card*>(meta->newInstance());
}

这时,你就可以在其他cpp里通过 Card* card = Engine::instance()->cloneCard(ISDN);

从不同的int值得到不同的Card类型的对象

https://zhuanlan.zhihu.com/p/32109735

单例模式:Qt本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性的更多相关文章

  1. ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点

    ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...

  2. mingw qt(可以去掉mingwm10.dll、libgcc_s_dw2-1.dll、libstdc++-6.dll的依赖,mingw默认都是动态链接gcc的库而TDM是静态链接gcc库,tdm版本更好用。用aspack压缩没有问题。qt本身不使用异常处理)good

    原文地址:mingw qt作者:孙1东 不使用Qt SDK,使用mingw编译qt源代码所遇问题及解决方法: configure -fast -release -no-exceptions -no-r ...

  3. C语言本身并不提供输入输出语句

    C语言本身并不提供输入输出语句,输入和输出操作是由函数来实现的.在C标准函数库中提供了一些输入输出函数,例如,printf函数和scanf函数.在使用他们时,千万不要误认为他们是C语言提供的“输入输出 ...

  4. 一天一个设计模式——(Singleton)单例模式(线程安全性)

    一.模式说明 有时候,我们希望在应用程序中,仅生成某个类的一个实例,这时候需要用到单例模式. 二.模式类图 三.模式中的角色 Singleton角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的 ...

  5. Qt自己定义事件实现及子线程向主线程传送事件消息

    近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...

  6. QThread 采用moveToThread方式实现多线程。 线程本身、connect关联的槽函数、connect关联的lambda对象分别运行在哪个线程中。

    Qt如何实现多线程:https://www.cnblogs.com/azbane/p/11372531.html September 5,2019 先抛出几个问题,用问题来引导思维导向: 1.继承的Q ...

  7. PyQt(Python+Qt)学习随笔:exit code 1073741845与槽函数所在对象不能定义同名实例方法问题

    最近做了几次测试,在PyQt中如果使用与槽函数同名的实例方法可能会导致不可控的错误. 案例1:如果两个信号映射到同名的槽函数,虽然参数不一样,但真正响应的槽函数是最后定义的槽函数,具体案例请见< ...

  8. 模板应用--UI线程与worker线程同步 模仿c# invoke

    由之前的一篇博文 <UI线程与worker线程><UI线程与worker线程>引出,UI线程与worker线程“串行化”在win32上实现是多么没有节操的事情,代码编写麻烦不说 ...

  9. Qt编写自定义控件4-旋转仪表盘

    前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...

随机推荐

  1. curl 上传文件

    1)在 php 5.5.0 之前,如果使用 @+文件路径的文件上传文件,具体看这里:http://www.cnblogs.com/tujia/p/5938463.html 2)php 5.5.0 之后 ...

  2. 计算直线与WGS84椭球的交点

    /************************************************************************/ /*线段与WGS84椭球求交 x^2/a^2+y^ ...

  3. Linux中的邮件发送

    这里写出两种常用的邮件发送方式: mail: 需要安装sendmail和postfix两个服务 编辑/etc/mail.rc,在最后添加 set from=scottcho@126.com smtp= ...

  4. C语言从零开始(十四)-字符串处理

    在软件开发过程中,字符串的操作相当频繁.在标准C语言库中提供了很多字符串处理的函数.今天我们来介绍一些常用的字符串处理函数.1. 字符串输入输出1.1 printf() scanf() 之前我们学习过 ...

  5. 《C++标准程序库》笔记之二

    <C++标准程序库>笔记之二 本篇博客笔记顺序大体按照<C++标准程序库(第1版)>各章节顺序编排. ------------------------------------- ...

  6. Windows 下 Tomcat 添加为系统服务

    标记一下,以便以后查看 setclasspath.bat 第一行插入 SET JAVA_HOME=C:\Program Files\Java\jre1.8.0_51 service.bat 第一行插入 ...

  7. .NET二级域名共享Session

    ASP.NET二级域名站点共享Session状态 今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享Session. 首先, Session要共享,站点之间SessionID必须要 ...

  8. 【大数据系列】hadoop集群的配置

    一.hadoop的配置文件分类 1.只读类型的默认文件 core-default.xml     hdfs-default.xml    mapred-default.xml   mapred-que ...

  9. ELK系列一:ELK的安装

    一.Elasticsearch.Kibana.Logstash.Elasticsearch-head的安装 ELK的安装 安装下载地址: https://www.elastic.co/cn/downl ...

  10. SOA架构商城一

    SOA架构: SOA是Service-Oriented Architecture的首字母简称,它是一种支持面向服务的架构样式.从服务.基于服务开发和服务的结果来看,面向服务是一种思考方式.其实SOA架 ...