[Qt]《开发指南》3.1源码分析
界面:
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源码分析的更多相关文章
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- FiddlerCoreAPI开发(一)源码分析
1.前言 前一段时间想利用fiddlercore截取本地HTTPS的流量做一些分析,按照样例代码的注释学习了一下,没搞清楚怎么实现,后来又在网上查了些资料,对HTTPS的处理提及很少,都没有解决我的问 ...
- linux epoll 开发指南-【ffrpc源码解析】
摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了.Epoll主要在服务器编程中使用,本文主要探讨服务器程序中epoll的使用技巧.Epoll一般 ...
- Spring Security 源码分析(四):Spring Social实现微信社交登录
社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...
- Java并发指南10:Java 读写锁 ReentrantReadWriteLock 源码分析
Java 读写锁 ReentrantReadWriteLock 源码分析 转自:https://www.javadoop.com/post/reentrant-read-write-lock#toc5 ...
- Qt update刷新之源码分析(一)
在做GUI开发时,要让控件刷新,会调用update函数:那么在调用了update函数后,Qt究竟基于什么原理.执行了什么代码使得屏幕上有变化?本文就带大家来探究探究其内部源码. Qt手册中关于QWid ...
- 移动web app开发必备 - Deferred 源码分析
姊妹篇 移动web app开发必备 - 异步队列 Deferred 在分析Deferred之前我觉得还是有必要把老套的设计模式给搬出来,便于理解源码! 观察者模式 观察者模式( 又叫发布者-订阅者模 ...
- Qt源码分析之QObject
原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...
- QT源码分析(从QApplication开始)
QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
随机推荐
- 全网最详细的Linux命令系列-cd命令
Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 命令格 ...
- elasticsearch之Java调用本地代码
虽然Java虚拟机为开发人员屏蔽了底层的实现细节,使得开发人员不用考虑底层操作系统的差异性.不过在某些应用程序中,还是免不了要直接与底层操作系统上的原生代码进行交互.今天我们就来看一下Java对本地调 ...
- 跨域库herryPostMessage.js的一些优化,多iframe跨域
旧库见文章:https://www.cnblogs.com/wuhairui/p/14595893.html 新版库主要做了下多个iframe和父页面交互的优化.主要使用构造函数的方式将多个ifram ...
- 说一下的dubbo的工作原理?注册中心挂了可以继续通信吗?
(1)dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客 ...
- Linux下禁用笔记本触摸板
1 概述 在Linux下禁用触摸板的方法有很多,这里列举三种: 图形界面配置关闭 modprobe关闭 xinput关闭 2 图形界面配置关闭 笔者的环境为Manjaro+Xfce,其他的桌面也应该类 ...
- Spring Boot demo系列(三):Spring Web+MyBatis Plus
2021.2.24 更新 1 概述 Spring Web+MyBatis Plus的一个Demo,内容和上一篇类似,因此重点放在MyBatis Plus这里. 2 dao层 MyBatis Plus相 ...
- Unknown custom element: <componentName> - did you register the component correct?
最近开发的时候遇见一个头疼的事情,之前用过的组件没有出现过任何问题,但偏偏在其他目录下引用就出问题了. 组件的名称.import的路径都没任何问题,看了其他人遇到的问题和官方文档关于组件name属性的 ...
- 【cypress】6. cypress的默认文件结构介绍
通过之前的一些介绍,已经大概其明白cypress是个啥,但是具体使用的细节点还有很多,需要一步步的去学习. 在安装好cypress之后,会生成一个默认项目,这个项目结构里的各个文件夹是干嘛使的呢? 一 ...
- ZOJ 3736 模拟魔方
题意: 2*2*2的魔方,给你一个初始状态,和一个限定步数,问你在这么多步数条件下最多能有多少面拼好,(不是累加关系,是某一个状态的最多,最多是6); 思路: 最多是7步,所以直 ...
- hdu1358 最小循环节,最大循环次数 KMP
题意: 给你一个字符串,让你找到一些字符串,这个字符串是从第一个字母开始的,并且他可以分成1个一上循环子结构够成的,比如 abcabcabc 那么当前的这个串就是三个abc构成的,他的A ...