【golang-GUI开发】struct tags系统(一)
我们已经介绍了qt的signal和slot,现在该讲讲它的struct tags系统了。qt拥有多种的struct tags,我们会去一一了解它们。
什么是struct tags?
struct tag
又叫做结构体标签,顾名思义,它就是用来给结构体字段做标记的。比如我们熟悉的JSON就使用了tags:
type User struct {
UserId int `json:"user_id" bson:"user_id"`
UserName string `json:"user_name" bson:"user_name"`
}
tags由反引号包裹,name在:
之前,value在:
之后由双引号包裹。
有了这些tags,我们的代码就可以很轻松的使用reflect来取得tags的name和name对应的值:
u := &User{UserId: 1, UserName: "tony"}
t := reflect.TypeOf(u)
field := t.Elem().Field(0)
fmt.Println(field.Tag.Get("json")) // "user_id"
fmt.Println(field.Tag.Get("bson")) // "user_id"
我们的qt正是依赖这一特性实现了Qt的moc系统,使用不同的tags除了可以实现signal和slot之外还能实现moc的多种功能,甚至是qt自己的一些扩展。
“->” 和 “<-”
在signal里我们已经介绍了auto,它具有很多的局限性,项目作者也表示auto应该尽量单独使用,不应该使用auto(...)
的形式。而为了更方便的连接signal和slot,我们就需要用到->
和<-
了。
先看个示例,这次我们从官方的例子里节选一段:
type Chart struct {
core.QObject
*charts.QChart
_ func() `constructor:"init"`
_ func() `slot:"handleTimeout,<-(this.m_timer.timeout)"`
}
对于槽handleTimeout,我们使用了<-
,它和下面这句等价:
this.m_timer.ConnectTimeout(this.handleTimeout)
意思是将this.m_timer
的Timeout信号和this.handleTimeout
函数connect,当触发了this.m_timer
的Timeout信号时这个函数也会被调用。
你也可以不指定信号名称,默认会和signal tag指定的信号名同名的函数进行connect:
_ func() `slot:"handleTimeout,<-(this.m_timer)"`
和
_ func() `slot:"handleTimeout,<-(this.m_timer.handleTimeout)"`
等价。
我们再来看一下->
的使用:
import "controller"
type dialogTemplate struct {
core.QObject
_ func() `constructor:"init"`
_ func(cident string) `signal:"show,<-(controller.Controller)"`
_ func(bool) `signal:"blur,->(controller.Controller)"`
}
可以看到,我们对信号Blur使用了->
,这个表达的含义与<-
相反,它是将signal tag声明的信号或是slot tag声明的槽与->
之后的函数进行connect,当你触发这个信号或是调用这个槽时,括号内的函数也会被调用,等价于:
this.ConnectBlur(controller.Controller.blur)
或是(如上面所说,可以省略函数名)
this.ConnectBlur(controller.Controller)
“->”和“<-”的一些使用规则
上一段里我们已经提到可以在这两个tags里省略连接和被连接对象的函数名,这里还有几个规则:
- 括号里指定的可以是全局对象,包括导入的包里的可见对象,例如上个例子里的
controller.Controller
。 - this代指当前对象的实例(可以理解为c++的
this
,python的self
占位符,或者golang的receiver
)。 - 括号里的内容还可以是
this.StructField
,也就是对象里的字段 - 对于想连接继承的
QObject
及其派生类或是其他类的signal/slot,目前只能使用this.BaseClass.method
的形式(与auto类似),这一点作者表示会在以后改进。
“->”和“<-”以及“auto”
这三者都需要和signal/slot tag配合使用,他们都会自动connect信号和槽,但是它们也有许多不同。
- 首先我们日常使用应该尽量使用
singal:"signalName,auto"
而不是auto(...)
,->
或<-
,如果只是为了少写Connect*
,那么不应使用后三者,因为除非你有大量的Connect*
需要编写,否则容易影响代码阅读,特别是对连接对象是当前类实例的成员函数时。 ->
和<-
用于不同的对象之间进行交互,比起分散的Connect*
调用,在struct tags里声明逻辑关系更易于维护。->
和<-
用于连接已有的信号和槽,如果想复用基类或者成员变量的signal和slot,你就需要->
或<-
替代auto
。- 和QML交互时,也应该使用
->
和<-
连接来自QML的signals。
客观上这三者都能极大的简化我们对signal/slot的实现和使用,所以根据不同的场景需求,我们需要选用合适的tags来简化我们的开发。
下一篇文章我们将了解constructor
这个tag,qt中的构造函数。
如果对本篇有什么疑问或者建议,欢迎在评论中提出。
祝玩得愉快!
【golang-GUI开发】struct tags系统(一)的更多相关文章
- 【golang-GUI开发】struct tags系统(二)qt的自定义组件和构造函数
今天我们来讲讲自定义组件和它的构造函数. 在前面的文章里我们已经接触了好几个自定组件,这次的示例是一个自定义对话框,他有一个about按钮,点击按钮可以显示出Qt的信息或者用户输入的信息.这是效果图: ...
- Sublime Text3 + Golang搭建开发环境
Sublime Text3 + Golang搭建开发环境 http://blog.csdn.net/aqiang912/article/details/46775409 1.安装git 因为golan ...
- 基于gin的golang web开发:集成swagger
在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...
- 漫谈GUI开发—各种平台UI开发概况
前言: 在看这边文章前,可以建议看下:图形界面操作系统发展史——计算机界面发展历史回顾 从CS到BS,现在的前端开发,其实也是GUI开发范畴.现今 各平台的UI开发概况 HTML&CSS,Wi ...
- php 图形用户界面GUI 开发
php 图形用户界面GUI 开发 一.下载指定系统扩展 1 2 http://pecl.php.net/package/ui http://pecl.php.net/package/ui/2.0.0/ ...
- golang安装开发环境配置
本机系统:fedora28 step 1 百度搜索 golang 到 go 语言中文网,下载 golang 包,如果是 linux 系统可以直接点击此连接,也可去 go 语言中文网, https:// ...
- 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析
原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...
- 基于gin的golang web开发:路由二
在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...
- 基于gin的golang web开发:模型绑定
在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...
随机推荐
- 把dotx模板的样式应用到当前文档中(不应用dotx的其他东西)
Word.Document doc = this.Application.ActiveDocument; //模板样式添加到当前文档 doc.CopyStylesFromTemplate(@" ...
- Linux-3.0.8中基于S5PV210的GPIO模块代码追踪和分析
编写按键驱动时,想知道内核是如何管理GPIO的,所以开始追踪代码,中间走了一些弯路,现记录于此. 追踪代码之前,我猜测:第一,这部分代码应该在系统set up阶段执行:第二,GPIO的代码应该在mac ...
- JS 将canvas画布保存到本地
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- 【腾讯Bugly干货分享】经典随机Crash之二:Android消息机制
本文作者:鲁可--腾讯SNG专项测试组 测试工程师 背景 承上经典随机Crash之一:线程安全 问题的模型 好几次灰度top1.top2 Crash发生场景:在很平常.频繁的使用页面,打开一个界面,马 ...
- 阿里,百度面试90%会问的Java面试题
题目一 请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别? 考点分析: 分析 Exception 和 Error 的区别,是从概念角度考察了 Java 处理机制.总的来 ...
- Javascript高级编程学习笔记(60)—— 事件(4)事件类型
事件类型 Web浏览器中可能发生的事件有许多种类型 不同类型的事件都有着自己独特的信息 在“DOM3级事件”规范中,规定了以下几类事件: UI事件 当用户与页面元素交互时触发 焦点事件 当 ...
- Python面向对象3:面向对象的三大特性
面向对象的三大特性- 封装- 继承- 多态1 封装 - 封装就是对对象的成员进行访问限制- 封装的三个级别: - 公开,public - 受保护的,protected - 私有的,private - ...
- 【详记MySql问题大全集】一、安装MySql
最近公司要从SqlServer转到MySql,期间在安装环境和数据迁移的过程中,遇到了一些不大不小问题,比如怎么重置密码.怎么设置大小写敏感等等. 这些问题都比较细比较杂,这边解决完可能过几天就忘了, ...
- [Swift]创建CoreData的两种方式
一.CoreData介绍 CoreData主要分为两部分: 上层是模型层,模型层有NSManagedObjectContext上下文管理着, 底层则是由SQLite实现的持久化部分,通过NSPersi ...
- HDFS第一次课堂测试
起初在linux上想使用Map/Reduce来完成操作,发现需要导入的jar包过多,大概在6点左右写完程序却跑不起来,一直在找jar包,直接被卡死在这里. 从教室回来之后,发现好多人都是在window ...