我们已经介绍了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里省略连接和被连接对象的函数名,这里还有几个规则:

  1. 括号里指定的可以是全局对象,包括导入的包里的可见对象,例如上个例子里的controller.Controller 。
  2. this代指当前对象的实例(可以理解为c++的this,python的self占位符,或者golang的receiver)。
  3. 括号里的内容还可以是this.StructField,也就是对象里的字段
  4. 对于想连接继承的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系统(一)的更多相关文章

  1. 【golang-GUI开发】struct tags系统(二)qt的自定义组件和构造函数

    今天我们来讲讲自定义组件和它的构造函数. 在前面的文章里我们已经接触了好几个自定组件,这次的示例是一个自定义对话框,他有一个about按钮,点击按钮可以显示出Qt的信息或者用户输入的信息.这是效果图: ...

  2. Sublime Text3 + Golang搭建开发环境

    Sublime Text3 + Golang搭建开发环境 http://blog.csdn.net/aqiang912/article/details/46775409 1.安装git 因为golan ...

  3. 基于gin的golang web开发:集成swagger

    在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...

  4. 漫谈GUI开发—各种平台UI开发概况

    前言: 在看这边文章前,可以建议看下:图形界面操作系统发展史——计算机界面发展历史回顾 从CS到BS,现在的前端开发,其实也是GUI开发范畴.现今 各平台的UI开发概况 HTML&CSS,Wi ...

  5. php 图形用户界面GUI 开发

    php 图形用户界面GUI 开发 一.下载指定系统扩展 1 2 http://pecl.php.net/package/ui http://pecl.php.net/package/ui/2.0.0/ ...

  6. golang安装开发环境配置

    本机系统:fedora28 step 1 百度搜索 golang 到 go 语言中文网,下载 golang 包,如果是 linux 系统可以直接点击此连接,也可去 go 语言中文网, https:// ...

  7. 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

    原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...

  8. 基于gin的golang web开发:路由二

    在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...

  9. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

随机推荐

  1. <笔记>Apache+PHP+MYSQL配置

    (1)Apache的the requested operation has failed错误: cmd—输入netstat –ano,可看到80端口已被进程占用,PID为4 打开任务管理器—〉查看—〉 ...

  2. java持有对象-集合类

    面阿里的时候,面试就让我说一下集合 当时由于条件原因没听清面试官的问题,后来面试后,面试官让问他问题的时候,才说明白是什么 下面就接受一下我了解的集合类 集合类中大致可以分为两个体系 一.collec ...

  3. Android-finished with non-zero exit value 2

    网上都是说,由于导入的依赖出现重复造成的,或者说 由于buildtools版本太高造成的,而我遇到的这个问题,这种两种方式无法去解决,所以才有了一下这种解决方式: 第一步,打开项目最外层的 build ...

  4. tcpdump完全指南

    先从第一个最简单的抓包指令开始 抓经过本主机上的所有网络接口的所有ARP.ICMP.IGMP.IP.TCP.UDP等所有网络包(以下简称“所有网络包”) tcpdump -i any -vnn (注: ...

  5. QEMU KVM libvirt手册(4) – images

    RAW raw是默认的格式,格式简单,容易转换为其他的格式.需要文件系统的支持才能支持sparse file 创建image # qemu-img create -f raw flat.img 10G ...

  6. Function Composition vs Object Composition

    In functional programming, we create large functions by composing small functions; in object-oriente ...

  7. Akka-Cluster(4)- DistributedData, 分布式数据类型

    在实际应用中,集群环境里共用一些数据是不可避免的.我的意思是有些数据可以在任何节点进行共享同步读写,困难的是如何解决更改冲突问题.本来可以通过分布式数据库来实现这样的功能,但使用和维护成本又过高,不值 ...

  8. 解决微信小程序登录与发布的一些问题

    解决微信小程序的问题 图片在电脑上显示但在手机上却无法显示的问题 要使用的是本地图片,不想把图片上传到网络再通过https的方式解决,解决方法如下: 1.image src中的图片地址对英文字母大小写 ...

  9. C#退出窗体的总结方法

    一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.En ...

  10. ueditor后台配置项返回格式出错,上传功能将不能正常使用

    和https://ask.csdn.net/questions/382087问题一样. java+jsp1.config.json配置不对2.百度依赖的jar包没引入3.请求controller.js ...