界面:

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. Kubernetes 用户流量接入方案

    总结Kubernetes 生产环境用户流量接入方案 方案1 client -> ddos -> waf -> slb 7层域名 -> nginx端口 -> ingress ...

  2. Spring Security OAuth2 实现登录互踢

    背景说明 一个账号只能一处登录,类似的业务需求在现有后管类系统是非常常见的. 但在原有的 spring security oauth2 令牌方法流程(所谓的登录)无法满足类似的需求. 我们先来看 To ...

  3. IntelliJ IDEA/Android Studio插件开发指南

    前言 目前在为安卓手机QQ做自动化的相关工作,包括UI自动化,逻辑层自动化等.使用到的uiautomator等框架,需要在Android Studio进行编码工作. 其中很多工作如果做到插件化的话,可 ...

  4. GO-01-GoLang的快捷键

  5. IdentityServer4+OAuth2.0+OpenId Connect 详解

    一  Oauth 2.0 1 定义 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. ...

  6. Vulkan移植GpuImage(四)从D到O的滤镜

    现把D到O的大部分滤镜用vulkan的ComputeShader实现了,列举其中一些有点特殊的说明. GaussianBlurPosition 指定区域高斯模糊 没有按照GPUImage里的方式实现, ...

  7. 01- APP移动端测试怎么测试?APP测试方法大全。

    由于智能手机时代来临,很多产品都有了APP,作为一个测试人员掌握APP测试是必要的. 在展开APP测试之前,首先了解一下几个点: 1.基于软件测试框架之上.复习下软件测试框架. 2.框架的内容贯穿于A ...

  8. jQuery+AJAX实现纯js分页功能

    使用jQuery的AJAX技术,在bootstrap的框架下搭建的纯js分页 bootstrap作为Twitter推的一款前端框架,效果个人还是觉得很不错的.这次只是拿来作为网页元素的css样式表使用 ...

  9. hdu4503 概率

    题意: 湫湫系列故事--植树节                                         Time Limit: 1000/500 MS (Java/Others) Memory ...

  10. 从苏宁电器到卡巴斯基第13篇:我在苏宁电器当营业员 V

    强大的竞争对手 与现在遍地开花的苹果店相比,在2010年左右的时候,在长春,真正得到苹果授权的苹果店还是屈指可数的.当时在重庆路上如果想买苹果的产品,要么可以去苏宁国美,要么只能去卓展楼上的苹果专区了 ...