我们已经介绍了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中的构造函数。
如果对本篇有什么疑问或者建议,欢迎在评论中提出。
祝玩得愉快!

转载于:https://www.cnblogs.com/apocelipes/p/9392628.html

【golang-GUI开发】struct tags系统(一)相关推荐

  1. golang日志服务器_日志系统 | log/syslog (log) – Go 中文开发手册 - Break易站

    Go 中文开发手册 日志系统 | log/syslog (log) - Go 中文开发手册 import "log/syslog"概述索引示例 概述 软件包系统日志为系统日志服务提 ...

  2. 开源一个golang小程序商城后台系统(moshopserver)

    开源一个golang小程序商城后台系统(moshopserver) 开源一个golang小程序商城后台(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一 ...

  3. [golang Web开发] 1.golang web开发:简介以及web服务器的搭建以及http协议简介

    一.web开发简介 1.简介 Web应用在我们的生活中无处不在,看看我们日常使用的各个应用程序,它们要么是 Web应用,要么是移动 App 这类 web应用的变种,无论哪一种编程语言,只要它能够开发出 ...

  4. python gui开发工具_深入解析Python,透析应用开发,涵盖9大应用领域的Python框架...

    前言 当前,Python 已经成为最流行的程序设计语言之一,被越来越多的人作为首选语言来学习和应用.作为一种解释型的语言,Python具有内置的高级数据结构和简单有效的面向对象编程机制.同时,其语法简 ...

  5. php7可以做什么开发,php7 图形用户界面GUI 开发怎么做?看完这个代码你就明白了...

    [摘要]php7作为PHP的一个版本,也能实现很多功能,不过今天环球网校的小编要为大家讲解php7 图形用户界面GUI 开发怎么做?看完这个代码你就明白了,因为只要你了解了php7 图形用户界面GUI ...

  6. python编程工具p-python Gui开发工具选择

    Python最大的特点就在于她的快速开发功能.作为一种胶水型语言,python几乎可以渗透在我们编程过程中的各个领域.这里我简单介绍一下用python进行gui开发的一些选择. 1.Tkinter T ...

  7. 【.NET Core 跨平台 GUI 开发】第一篇:编写你的第一个 Gtk# 应用

    本文是[.NET Core 跨平台 GUI 开发]系列博文的第一篇.该系列博文是一个关于 Gtk# 跨平台应用开发的初级随笔集合.该随笔集合介绍了 GTK 和 Gtk# 的基本信息以及开发方法,并展示 ...

  8. 【Java】浅谈Java的GUI开发

    GUI是什么? 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 图形用户界面是一种人与计算机通信的界面显示格 ...

  9. golang服务开发平滑升级之优雅重启

    女主宣言 本文章主要探讨golang服务器开发中在平滑升级过程中对优雅重启的使用与研究. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算",点关注哦! 经典平滑升级方案 ...

最新文章

  1. windows下db2数据库的卸载
  2. ubuntu 14.04 安装redmine
  3. CPU并行与GPU并行联系及区别
  4. 老师,我们想看到您的笑容!
  5. PHP语法像C,PHP编程语法的三个魅力之处
  6. html css没有反应,只有CSS和HTML的标签没有正确响应
  7. 最痛苦的一周——第三周作业Collinear
  8. java中绘制长方形,椭圆形,圆形的方法
  9. 联想 M7400 pro Linux下 CUPS 驱动安装
  10. 一种雷达和电子海图图像叠加方法
  11. v2ex站长专访 - 100offer专访Livid:不仅仅是V站站长
  12. 污水计算机仿真技术,活性污泥法污水处理计算机仿真软件的开发及应用
  13. typora:一些常用数学符号
  14. 计网day12 奈氏准则和香农定理
  15. 【opencv】18、视频操作
  16. 东北大学OJ题解—1741: C语言编程测试2020-6-11-焦明海
  17. Workbench中DM建模草图修改不了的解决办法
  18. 基于蒙特卡诺和拉格朗日乘子法的电动车调度【有序、无序充放电】【Matlab代码】
  19. 计算机专业英语 论文的框架结构,一张图看懂硕士论文框架结构
  20. 微信小程序之model弹框

热门文章

  1. python解常微分方程龙格库_求解常微分方程组初值问题的龙格库塔法分析及其C代码...
  2. localhost可以访问 ip不能访问_如何解决域名可以访问80端口但访问不了其他端口的问题...
  3. java 打包工具_Java打包Windows安装程序
  4. python黑网站_python
  5. java 删除指定文件夹和下面所有文件_JAVA语言基础
  6. 图像形状特征(四)--轮廓树及PGH
  7. python list去重函数_Python基础中的集合,函数——06
  8. 导航守卫与keep-alive
  9. mysql安装无法创建mysqld_MySQL 5.7安装错误`mysqld:无法创建/写入文件’/ var / lib / mysql / is_writable’...
  10. Linux开发_printf打印无消息或末尾带“#“or“%“