界面:

ButterflyGraph:

可以看出,本工程在主程序main里调用窗口界面qmywidget,窗口界面继承了QWidget,并调用自定义类qperson,推测是qmywidget类中的一个属性

qmywidget的实现,调用了显示界面ui_qmywidget,包含了元对象QMetaProperty

UML图:

QmyWidget中,on开头的都是槽函数,QmyWidget是主窗口,所以不发射信号,只接收信号

main.cpp

 1 #include "qmywidget.h"
2 #include <QApplication>
3
4 int main(int argc, char *argv[])
5 {
6 QApplication a(argc, argv);
7 QmyWidget w;
8 w.show();
9
10 return a.exec();
11 }

qperson.h

 1 #ifndef QPERSON_H
2 #define QPERSON_H
3
4 #include <QObject>
5
6 class QPerson : public QObject
7 {
8 Q_OBJECT
9
10 Q_CLASSINFO("author","Wang")
11 Q_CLASSINFO("company","UPC")
12 Q_CLASSINFO("version","1.0.0")
13
14 Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)
15 Q_PROPERTY(QString name MEMBER m_name)
16 Q_PROPERTY(int score MEMBER m_score)
17 private:
18 int m_age=10;
19 QString m_name;
20 int m_score=79;
21 public:
22 explicit QPerson(QString fName, QObject *parent = nullptr);
23
24 int age();
25 void setAge(int value);
26
27 void incAge();
28 signals:
29 void ageChanged( int value);
30
31 public slots:
32 };
33
34 #endif // QPERSON_H

qmywidget.cpp

  1 #include "qmywidget.h"
2 #include "ui_qmywidget.h"
3 #include <QMetaProperty>
4
5 QmyWidget::QmyWidget(QWidget *parent) :
6 QWidget(parent),
7 ui(new Ui::QmyWidget)
8 {//构造函数
9 ui->setupUi(this);
10
11 boy=new QPerson("王小明");
12 boy->setProperty("score",95);
13 boy->setProperty("age",10);
14 boy->setProperty("sex","Boy");//动态属性
15 // connect(boy,SIGNAL(ageChanged(int)),this,SLOT(on_ageChanged(int)));
16 connect(boy,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged);
17
18 girl=new QPerson("张小丽");
19 girl->setProperty("score",81);
20 girl->setProperty("age",20);
21 girl->setProperty("sex","Girl");//动态属性
22 connect(girl,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged);
23
24 ui->spinBoy->setProperty("isBoy",true); //动态属性
25 ui->spinGirl->setProperty("isBoy",false);
26
27 // 不能使用此形式,因为QSpinBox有两种参数形式的valueChanged()信号
28 // connect(ui->spinGirl,&QSpinBox::valueChanged,
29 // this,&QmyWidget::on_spinBoy_valueChanged);
30 connect(ui->spinGirl,SIGNAL(valueChanged(int)),
31 this,SLOT(on_spin_valueChanged(int)));
32 connect(ui->spinBoy,SIGNAL(valueChanged(int)),
33 this,SLOT(on_spin_valueChanged(int)));
34 }
35
36 QmyWidget::~QmyWidget()
37 {
38 delete ui;
39 }
40
41 void QmyWidget::on_ageChanged( int value)
42 {//响应QPerson的ageChanged()信号
43 Q_UNUSED(value);
44 QPerson *aPerson = qobject_cast<QPerson *>(sender()); //类型投射
45 QString hisName=aPerson->property("name").toString(); //姓名
46 // QString hisName=aPerson->name(); //获取姓名,错误
47 QString hisSex=aPerson->property("sex").toString(); //动态属性
48 int hisAge=aPerson->age();//通过接口函数获取年龄
49 // int hisAge=aPerson->property("age").toInt();//通过属性获得年龄
50
51 ui->textEdit->appendPlainText(hisName+","+hisSex
52 +QString::asprintf(",年龄=%d",hisAge));
53 }
54
55 void QmyWidget::on_btnClear_clicked()
56 {//"清空文本框"按钮
57 ui->textEdit->clear();
58 }
59
60 void QmyWidget::on_btnBoyInc_clicked()
61 {//"boy长大一岁"按钮
62 boy->incAge();
63 }
64
65 void QmyWidget::on_btnGirlInc_clicked()
66 {//"girl长大一岁"按钮
67 girl->incAge();
68 }
69
70 void QmyWidget::on_spin_valueChanged(int arg1)
71 {//响应界面上spinBox的valueChanged(int)信号
72 Q_UNUSED(arg1);
73 QSpinBox *spinBox = qobject_cast<QSpinBox *>(sender());
74 if (spinBox->property("isBoy").toBool())
75 boy->setAge(spinBox->value());
76 else
77 girl->setAge(spinBox->value());
78 }
79
80 void QmyWidget::on_btnClassInfo_clicked()
81 {//"类的元对象信息"按钮
82 const QMetaObject *meta=boy->metaObject();
83 // const QMetaObject *meta=girl->metaObject();
84 // const QMetaObject *meta=ui->spinBoy->metaObject();
85 ui->textEdit->clear();
86
87 ui->textEdit->appendPlainText("==元对象信息==\n");
88 ui->textEdit->appendPlainText(QString("类名称:%1\n").arg(meta->className()));
89
90 ui->textEdit->appendPlainText("property");
91 for (int i=meta->propertyOffset();i<meta->propertyCount();i++)
92 {
93 const char* propName=meta->property(i).name();
94 ui->textEdit->appendPlainText(
95 QString("属性名称=%1,属性值=%2").arg(propName).arg(boy->property(propName).toString()));
96 }
97
98 ui->textEdit->appendPlainText("");
99 ui->textEdit->appendPlainText("classInfo");
100 for (int i=meta->classInfoOffset();i<meta->classInfoCount();++i)
101 {
102 QMetaClassInfo classInfo=meta->classInfo(i);
103 ui->textEdit->appendPlainText(
104 QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value()));
105 }
106
107 }

qperson.cpp

 1 #include "qperson.h"
2
3 QPerson::QPerson(QString fName,QObject *parent) : QObject(parent)
4 { //构造函数
5 m_name=fName;
6 }
7
8 int QPerson::age()
9 { //返回age
10 return m_age;
11 }
12
13 void QPerson::setAge(int value)
14 {//设置age
15 m_age=value;
16 emit ageChanged(m_age); //发射信号
17 }
18
19 void QPerson::incAge()
20 {
21 m_age++;
22 emit ageChanged(m_age);//发射信号
23 }

[Qt]《开发指南》3.1源码分析的更多相关文章

  1. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  2. FiddlerCoreAPI开发(一)源码分析

    1.前言 前一段时间想利用fiddlercore截取本地HTTPS的流量做一些分析,按照样例代码的注释学习了一下,没搞清楚怎么实现,后来又在网上查了些资料,对HTTPS的处理提及很少,都没有解决我的问 ...

  3. linux epoll 开发指南-【ffrpc源码解析】

    摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了.Epoll主要在服务器编程中使用,本文主要探讨服务器程序中epoll的使用技巧.Epoll一般 ...

  4. Spring Security 源码分析(四):Spring Social实现微信社交登录

    社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...

  5. Java并发指南10:Java 读写锁 ReentrantReadWriteLock 源码分析

    Java 读写锁 ReentrantReadWriteLock 源码分析 转自:https://www.javadoop.com/post/reentrant-read-write-lock#toc5 ...

  6. Qt update刷新之源码分析(一)

    在做GUI开发时,要让控件刷新,会调用update函数:那么在调用了update函数后,Qt究竟基于什么原理.执行了什么代码使得屏幕上有变化?本文就带大家来探究探究其内部源码. Qt手册中关于QWid ...

  7. 移动web app开发必备 - Deferred 源码分析

    姊妹篇  移动web app开发必备 - 异步队列 Deferred 在分析Deferred之前我觉得还是有必要把老套的设计模式给搬出来,便于理解源码! 观察者模式 观察者模式( 又叫发布者-订阅者模 ...

  8. Qt源码分析之QObject

    原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...

  9. QT源码分析(从QApplication开始)

    QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...

  10. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

随机推荐

  1. Swagger3注解使用

    这里只简单的说一下swagger的传值,返回值时注解的使用演示.相关注解及说明见其他文章 接收参数方式1 我们常规接收参数,可以使用一个类,类里面把属性作为接收的参数,使用注解对属性进行说明.但是这种 ...

  2. [Fundamental of Power Electronics]-PART I-2.稳态变换器原理分析-2.3 Boost 变换器实例

    2.3 Boost 变换器实例 图2.13(a)所示的Boost变换器器是另一个众所周知的开关模式变换器,其能够产生幅值大于直流输入电压的直流输出电压.图2.13(b)给出了使用MOSFET和二极管的 ...

  3. 了解什么是Odoo,为二次开发做准备

    什么是odoo odoo是由python语言开发,XML为模板的一体化业务解决方案系统,主要使用在企业资源规划(ERP)领域,还可以当做CMS系统,快速搭建自己博客.商城...系统 odoo前身是Op ...

  4. MQ 入门实践

    MQ Message Queue,消息队列,FIFO 结构. 例如电商平台,在用户支付订单后执行对应的操作: 优点: 异步 削峰 解耦 缺点 增加系统复杂性 数据一致性 可用性 JMS Java Me ...

  5. Python 高级进阶知识(一)

    参考 Python学习手册 第四版 1 from vs import import 模块 : 导入的一整个模块(python中模块对应一个py文件) 因为import使用一个变量名引用整个模块对象,所 ...

  6. Linux下Matlab的安装

    1 概述 笔者环境Manjaro,本来想直接通过yay安装的,但无奈失败了,于是直接从官网下载进行安装. 2 下载安装包 Matlab官网可以戳这里,点击右上角的Get MATLAB就可以下载了: 没 ...

  7. 《C++ primer》学习笔记整理

    简介 本笔记目前已包含<C++ Primer>中的绝大部分内容,但尚有部分小节有所缺漏,如 19.1.19.2 节的笔记尚未整理,会持续更新. 本项目中的学习笔记是在学完一章内容后,对其要 ...

  8. CloudBase CMS + Next.js:轻松构建一个内容丰富的站点

    项目背景 试想一下,如果你现在要为你自己或者你所在的组织创建一个强内容的站点,同时要求好的 SEO(搜素引擎优化),比如博客,你会怎么做呢? 由 vite 或者 create-react-app 等脚 ...

  9. 中文NER的那些事儿1. Bert-Bilstm-CRF基线模型详解&代码实现

    这个系列我们来聊聊序列标注中的中文实体识别问题,第一章让我们从当前比较通用的基准模型Bert+Bilstm+CRF说起,看看这个模型已经解决了哪些问题还有哪些问题待解决.以下模型实现和评估脚本,详见 ...

  10. volatile修饰全局变量,可以保证并发安全吗?

    今天被人问到volatile能不能保证并发安全? 呵,这能难倒我? 上代码: //电脑太好,100线程起步~public class ThreadTest { private static volat ...